2014-11-21 2 views
0

У меня есть ок. 150 текстовых файлов, содержащих данные, которые мне нужно вставить в таблицы MS SQL. Когда я прочитал строки, я прочитал первые 4 символа, чтобы определить данные в этой строке. Строка, следующая за текущей строкой, может быть или не быть данными, относящимися к текущей строке (я могу знать это только после того, как прочитал строку, поскольку нет идентификаторов связывания). Единственный способ рассказать о следующей строке - это новая запись, чтобы прочитать код строки. Вот пример данных (это данные, считываемые из кассового аппарата). Я прокомментировал каждую строку, чтобы объяснить, что это такое.File.ReadLines с линией Peek Ahead

0001,00,111008,05,0909,000702,0003,0000,0001,0000,0000,0000,0000,2 //0001 = Sales header** 
1C00 //1C00 = No Sale (and relates to the Sales Header above) 
0001,00,111008,05,0934,000702,0004,0000,0001,0000,0000,0000,0000,2 //0001 = Sales header 
1C00 //1C00 = No Sale (and relates to the Sales Header above) 
0001,00,111008,05,0945,000702,0005,0000,0001,0000,8000,0000,0000,4 //0001 = Sales header 
0200,1,19781849813891,1.000,5.99,5.99,000000,00,00,01,10,10 //0200 = Sales Detail line 
1401,5.99,0000,000000,00 //1401 = Card Sale (operator press wrong button as its followed by change given record) 
1501,0.00,02,01,0000,000000,00 //1501 - Change Given 
0001,00,111008,00,1327,000802,0103,0000,0003,0000,8000,0000,1000,7 //0001 = Sales header 
0200,1,19780857223968,1.000,7.99,7.99,000000,00,00,01,10,10 //0200 = Sales Detail line 
0200,1,19781847708427,1.000,7.99,7.99,000000,00,00,01,10,10 //0200 = Sales Detail line 
0502,-10.00,-1.60,00,FF //0502 - Discount applied to complete sale 
5101,14.38,2.40,11.98 //5101 - Sub Total after discount applied 
1201,15.00,0000,000000,00 //1201 - Cash Sale 
1501,0.62,00,01,0000,000000,00 //1501 - Change Given 

Мой план заключается в создании схемы и использовать EF для вставки данных, как он будет сортировать, связывающие идентификаторы для меня. Или я мог бы создать свои собственные классы и самостоятельно назначить идентификаторы. Единственное требование, которое создает для меня проблему, заключается в том, что у записи SaleHeader должен быть флаг «Нет продажи», кажется достаточно простым и, вероятно, является ...

Однако в любом случае моя проблема возникает при чтении текстовых файлов ....

 foreach (string file in Directory.GetFiles(@"C:\Temp2\Tills\")) 
     { 
      foreach (string line in File.ReadLines(@file)) 
      { 

       string[] linearr = line.Split(','); 

Мне нужно знать, какие данные на следующей строке в этот момент.

   if(linearr[0] == "0001") 
       { 
        //New sale 
       } 
       else if (linearr[0] == "0200") 
       { 
        //Sale details line 
       } 
       else if (linearr[0] == "0502") 
       { 
        //Sale discount line 
       } 


      } 
     } 

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

Вопрос: есть ли все-таки «Peek Ahead» на следующей строке при чтении файлов в строках?

Если кто-нибудь может видеть, что проще было получить эти данные в базу данных, мне было бы интересно услышать!

+2

взгляните на [этот ответ] (http://stackoverflow.com/questions/842465/reading-a-line-from-a-streamreader-without-consuming) или [этот ответ] (http: // stackoverflow.com/questions/13548443/textreader-and-peek-next-line) – Jonesopolis

+0

В качестве альтернативы вы могли бы вспомнить предыдущую строку. – juharr

ответ

0

В случае, если это находится из поиска Google ...

я изменил свой подход и пошел с ReadAllLines. Я прочитал весь файл в массив строк, а затем разделил каждую строку, чтобы получить значения. Я сам установил идентификатор, и если я найду значение, которое я ищу, я установил предыдущее значение «нет продажи» в заголовке. Затем я загружаю все данные в таблицу данных и использую SqlBulkCopy для вставки данных в базу данных. Я сократил время, затрачиваемое существующим приложением с 18 часов на обработку 38 файлов на 18 минут для обработки 170 файлов. Счастлив с этим.