Как сравнить два файла TXT перед отправкой в ​​SQL - PullRequest
0 голосов
/ 05 мая 2010

Я должен обрабатывать файлы данных TXT, которые поступают с одного устройства для встраивания. Моя проблема в том, что устройство всегда отправляет все захваченные данные, но я хочу использовать только различия между двумя отправками и выполнять вычисления на них. После расчета я отправляю его в SQL с помощью функции bulkinsert. Я хочу извлечь данные, которые отличаются в зависимости от первого файла, который я получил с устройства. Латс говорит, что устройство впервые отправляет такие данные в файл some.dat (ASCII)

0000199991
0000199321
0000132913
0000232318
0000312898

При повторных вызовах для получения данных с устройства он снова будет возвращать все (предыдущие и следующие захваченные записи) что-то вроде этого

0000199991
0000199321
0000132913
0000232318
0000312898
9992129990
8782999022
2323423456

Но на этот раз я хочу только рассчитать и передать данные, добавленные после первой вставки. Я пытаюсь сделать приложение Win Forms, используя C # и Visual Studio 2008

Ответы [ 3 ]

3 голосов
/ 05 мая 2010

Вы можете сделать это, используя LINQ:

string[] addedLines = File.ReadAllLines(secondPath)
                          .Except(File.ReadAllLines(firstPath))
                          .ToArray();

Обратите внимание, что для больших файлов это будет медленно.

Для больших файлов замените ReadAllLines следующим способом: (В .Net 4 вместо него можно использовать File.ReadLines)

static IEnumerable<string> EnumerateLines(string path) {
    using(var reader = File.OpenText(path)) {
        string line;
        while(null != (line = reader.ReadLine())
            yield return line;
    }
}
1 голос
/ 05 мая 2010

Будет ли это работать для вас?

string dataAddedAfterFirstInsert = secondString.SubString(firstString.Length, secondString.Length)
1 голос
/ 05 мая 2010

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

Вот примерный план идеи

  long lastPosition = GetLastFilePositionFromDatabase();
  using (FileStream fs = new FileStream(...))
  {
    // Seek to the last position, this is zero the first time
    fs.Seek(lastFilePosition, SeekOrigin.Begin);

    // Process your file from the current position
    ProcessFile(fs);

    // Once you reach the end of the file, save this position so 
    // for use with the next file
    SaveLastFilePositionToDatabase(fs.Position);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...