Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
RSS
Обработка большого файла, Желательно на C#
 
Есть тхт файл : 60 000 строк. приблизительно 4 мб
Нужно удалить из него все повторения.
Может кто реализовывал подобное.
Поделитесь.
Спасибо большое.
 
Перекидываем в MS ACCESS,
Создаём там таблицу с одним полем тип MEMO, делаем поле индексируемым (совпадения допускаются), ключевых полей не создаём

Вставляем в таблицу исходный текст

Делаем запрос на “Исключение повторяющихся строк в запросе”, во встроенной справке примеров полно

Ну далее запускаем запрос, и его результат через буфер обмена перекидываем куда нужно
 
Пересортировка допускается? Есть ли в строках данные (например дата-время записи), которые позволят пересортировкой восстановить исходный порядок уже обработанных данных, если это вообще необходимо?

Если да, то задачка решается «на коленке» за пару минут, при помощи классических sort и awk. Результата их работы ждать ненамного дольше.
Изменено: disintegrator - 01.04.2010 16:27:46
 
если пересортировка допускается, и кодить не умеешь, то exelem в ручную ;)
 
Вот пример текста :
И таких строк там болие 60 000 тис.
Код
48728;2852809000000;Название товара 1;1,000000;
26648;4820079200103;Название товара 2 ст/б;1,000000;
27795;4820068312107;Название товара 3;1,000000;
37166;4810344008831;Название товара 4;1,000000;
23243;4823028003213;бла бла бла;1,000000;
30058;4820046280534;и т.д.;1,000000;

Почти все строки имеют разную длину.
У кого какие приложения ?
Спасбио большое.
 
не совсем понятно, что вы хотите сделать.. вы говорите повторяющиеся строки или значения в строках?
 
хеш-таблица вам в помощь.

60к записей - это вообще ниочем. как и 4Мб размер - в L2 кеш процессора помещается.
Изменено: ^rage^ - 02.04.2010 13:23:25
 
Цитата
SAMBO пишет:
не совсем понятно, что вы хотите сделать.. вы говорите повторяющиеся строки или значения в строках?
Строки .Вся строка целиком.
 
ну так загоняй его в ексель/опенофис калк - сортируй и удаляй
 
OMG, загнать в БД? зачем? :) а вообще наверное весело ходить на муравьев с ломом ;)

Вот вам моя гравицапа, собранная за 5 минут на коленках ;)

Код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace antinoob
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileNameIn = "strings.txt";
            string fileNameOut = "stringsOutput.txt";
            IList<string> result = new List<string>();
            try
            {
                using (StreamReader sr = new StreamReader(fileNameIn, Encoding.GetEncoding(866)))
                {
                    string buf;
                    while ((buf = sr.ReadLine()) != null)
                    {
                        if (!result.Contains(buf))
                            result.Add(buf);
                    }

                    using (StreamWriter sw = new StreamWriter(fileNameOut, false, sr.CurrentEncoding))
                    {
                        foreach (string item in result)
                            sw.WriteLine(item);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error" + ex.Message);
            }
        }
    }
}
 
Цитата
Андрей Top Secret пишет:
Вот вам моя гравицапа, собранная за 5 минут на коленках
из пушки по воробьям :)

python:

Код
hash={}
fh=open('infile.txt','rb')
for line in fh:
  if not line in hash:
   print line
   hash[line]=''

Изменено: ^rage^ - 02.06.2010 10:47:28
 
Легко - сохраняем в *.vbs файл и запускаем в папке с нужными файлами. Расширение файов должно быть - *.dic

Итог - получаем сортированный по алфавиту файл без повторяющихся строчек. Удачи!


Код
Option Explicit

Dim FSO, data, TextStream, szStrTmp, i, j, Sfolder, dDate

If ScriptHost <> "cscript.exe" Then
    CreateObject("WScript.Shell").Run "cmd /c start /wait /max cscript.exe " & Chr(34) & Wscript.ScriptFullName & Chr(34), 0, True
    Wscript.quit
End If

Set FSO = CreateObject("Scripting.FileSystemObject")

fRecurseFolder "."

wscript.quit

Sub fRecurseFolder(strFolder)
        
    Dim Sfolder, Sfiles, SFolders, Sfile, i
        
    If FSO.FolderExists(strFolder) Then
        Set Sfolder = FSO.GetFolder(strFolder)
        Set Sfiles = Sfolder.Files
        Set SFolders = Sfolder.Subfolders
        For Each Sfile In Sfiles
            If LCase(Right(Sfile.Path, 4)) = ".dic" Then
            j = FSO.GetFile(Sfile.Path).Size
                If j > 0 Then
                    data = Split(FSO.GetFile(Sfile.Path).OpenAsTextStream.ReadAll, vbCrLf)
                    QuickSort data, LBound(data), UBound(data)
                    Set TextStream = FSO.GetFile(Sfile.Path).OpenAsTextStream(2)
                    For i = 0 To UBound(data)
                        If Len(Trim(data(i))) > 0 Then
                            If szStrTmp <> data(i) Then TextStream.WriteLine data(i)
                            szStrTmp = data(i)
                  End If
               Next
               TextStream.Close
               if FSO.GetFile(Sfile.Path).Size <> j then
                  Wscript.echo Sfile.Path & vbtab & j & vbtab & FSO.GetFile(Sfile.Path).Size
               else
                  Wscript.echo Sfile.Path
               end if
                End If
            End If
        Next
        
    End If
    
End Sub

msgbox "Sort completed"

Wscript.quit


Public Function QuickSort(ByRef vData, Low, Hi)

  If Not IsArray(vData) Then Exit Function

  Dim lTmpLow
  Dim lTmpHi
  Dim lTmpMid
  Dim vTempVal
  Dim vTmpHold
  
  lTmpLow = Low
  lTmpHi = Hi
  
  If Hi <= Low Then Exit Function

  lTmpMid = (Low + Hi) \ 2

  vTempVal = vData(lTmpMid)

  Do While (lTmpLow <= lTmpHi)

     Do While (vData(lTmpLow) < vTempVal And lTmpLow < Hi)
           lTmpLow = lTmpLow + 1
     Loop
      
     Do While (vTempVal < vData(lTmpHi) And lTmpHi > Low)
           lTmpHi = lTmpHi - 1
     Loop
            
     If (lTmpLow <= lTmpHi) Then
         vTmpHold = vData(lTmpLow)          ' Move the Low value to Temp Hold
         vData(lTmpLow) = vData(lTmpHi)     ' Move the high value to the low
         vData(lTmpHi) = vTmpHold           ' move the Temp Hod to the High
         lTmpLow = lTmpLow + 1              ' Increment the temp low counter
         lTmpHi = lTmpHi - 1                ' Dcrement the temp high counter
     End If
     
  Loop
          
  If (Low < lTmpHi) Then
      QuickSort vData, Low, lTmpHi
  End If
          
  If (lTmpLow < Hi) Then
       QuickSort vData, lTmpLow, Hi
  End If
  
End Function

Function N2S(Number)
    Dim s
    s = CStr(Number)
    If Len(s) = 1 Then s = "0" + s
    If Len(s) > 2 Then s = Right(s, 2)
    N2S = s
End Function

Function ScriptHost()
  ScriptHost = LCase(Mid(Wscript.FullName, Len(Wscript.Path) + 2))
End Function

Страницы: 1
Читают тему