Обработка и объединение двух больших файлов - PullRequest
3 голосов
/ 17 июня 2011

Мне нужно прочитать два больших файла (более 125 МБ).Каждый файл содержит записи с похожими данными.Мне нужно найти записи, которые есть в них обоих, а затем, если поля записей не совпадают, мне нужно перезаписать записи в файле два полями, содержащимися в записях из файла один.

Например, первый файл имеет следующие поля:

ID, ACCT, Bal, Int, Rate 

Второй файл имеет следующие поля:

TYPE, ID, ACCT, Bal, Int, Rate.  

Таким образом, если запись в файле 1 имееттот же номер ACCT, что и у записи в файле 2, тогда Bal, Int и Rate в файле 2 должны быть перезаписаны значениями Bal, Int и Rate из файла 1.

Некоторые из выигранных записейнет в каждом файле.Выходной файл, который мне нужно создать, - это все записи из файла два, и если запись не находится также в файле один, он будет записан в файл как есть, но затем будут включены записи, которые необходимо изменить.

Я пробовал много разных вариантов, но большинство из них недостаточно эффективны для работы с большими файлами.Как правильно выбрать решение этой проблемы?Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Определите два класса, специфичных для каждого типа, по одному для каждого файла.

class FileOne
{ 
    public int LineNumber {get;set};
    public int Id{get;set;}; 
    public double Bal {get;set;};
...
}

class FileTwo
{ 
    public int LineNumber {get;set};
    public string TranType{get;set;};  // type = reserved word
    public int Id{get;set;}; 
    public double Bal {get;set;};
...
}

Загрузите ваш файл в IList <> для каждого файла, чтобы у вас были IList myFileOne и IList myFileTwo, и запишите номер строки каждого из них.введите, чтобы вы знали, где они появляются в файле.

Теперь используйте linq для запроса различий между ними:

var diffs = from f1 in myFileOne
            join f2 in myFileTwo on f1.Id = f2.Id
            where f1.Bal != f2.Bal // add whatever conditions you need here
            select new {
                f1.Id, f2.Bal, f2.Int, f2.Rate, f1.LineNum
            }

Различия станут перечисляемой коллекцией из 4 полей в select,Теперь вы можете выполнить итерацию, используя f1.LineNum, найти правильный номер строки в myFileOne и обновить его значениями, найденными в f2.

Помогает ли это, или вас больше интересовало, как получить доступ к самому файлу?

0 голосов
/ 17 июня 2011

Загрузить все записи из файла 1 в хеш-таблицу с ключом ACCT.
Зациклите все записи в файле 2 и обновите при необходимости.

Сложность: O (n)

НТН

...