File.ReadLines with Line Peek Ahead

时间:2014-11-21 15:17:41

标签: c# sql entity-framework sql-server-2008 file-io

我有约。包含我需要插入MS SQL表的数据的150个文本文件。当我读到这些行时,我读了前4个字符来确定该行中的数据。当前行之后的行可能是也可能不是与当前行有关的数据(由于没有链接标识符,我只能在读取该行时知道这一点)。告诉下一行的唯一方法是新记录是读取行代码。这是一个数据示例(它是从收银机读取的数据)。我已经评论了每一行来解释它是什么。

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来插入数据,因为它会为我排序链接ID。或者我可以创建自己的类并自己分配ID。为我创造问题的一个要求是SaleHeader记录必须有一个" No Sale"国旗,似乎很简单,可能是......

然而,无论哪种方式,我的问题出现在阅读文本文件....

        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"在逐行读取文件时在下一行?

如果有人能够看到更简单的将数据存入数据库,我将有兴趣听到!

1 个答案:

答案 0 :(得分:0)

如果是从Google搜索中找到的话......

我改变了方法并使用了ReadAllLines。我将整个文件读入一个字符串数组,然后拆分每一行以获取值。我自己设置了Id,如果我找到了我想要的价值,我就会设置上一个标题" no sale"值。然后,我将所有数据加载到数据表中,并使用SqlBulkCopy将数据插入数据库。我将现有应用程序的时间从18小时减少到处理38个文件到18分钟处理170个文件。很高兴。