5

我正在做一个项目,我必须从 .txt 文件中读取数据,然后使用查询将每一行插入到表中。

现在例如文本文件的内容将是

11111

1111x

22222

2222x

33333

3333x

等等。

现在您可以看到备用行几乎是重复的,所以我想删除备用行,以便可用数据变为

11111

22222

33333

然后处理我的其余代码。

有什么办法可以做到吗?

到目前为止,我一直在使用数组列表来获得这个

using (StreamReader sr = new StreamReader(Server.MapPath("03122013114450.txt"), true))
        {

            string txtValues = sr.ReadToEnd();
            string[] txtValuesArray1 = Regex.Split(txtValues, "\r\n");



            ArrayList array = new ArrayList();
            foreach (string value in txtValuesArray1)
            {
                array.Add(value);
            }

            for (int i = 0; i < array.Count; i++)
            {
                if (array.Count % 2 != 0)
                    array.RemoveAt(i + 2);
                else
                    array.RemoveAt(i + 1);
            }
        }

基本思想是从文本文件的数组列表的索引中删除备用行。

4

4 回答 4

2

刚刚用 LINQ 试过这个

string[] lines = File.ReadAllLines("your_file_name");
var result = lines.Where((s, idx) => idx % 2 == 0);

当然,如果您的文件非常大,那么您需要逐行工作并在阅读时跳过不需要的行

于 2013-03-14T12:17:50.337 回答
2

快速优化,

static IEnumerable<string> OddLines(string path)
{
    var flipper = true;

    foreach (var line in File.ReadLines(path))
    {
        if (flipper) yield return line;
        flipper = !flipper;
    }
}

你可以像这样使用它,

var oddlines = OddLines(Server.MapPath("03122013114450.txt")); 

或者,甚至更简单

var oddlines = File.ReadLines(Server.MapPath("03122013114450.txt"))
                   .Where((l, i) => i % 2 == 0);
于 2013-03-14T12:15:52.303 回答
1

您通常想要做的是一次读取文件的一行,而不是将磁盘上的所有数据缓冲到内存中。想想它是否是一个 2GB 的文本文件(这不是什么不寻常的问题)——在开始处理它之前,您正在等待 2GB 的文件先加载。

ulong count = 0;
using (StreamReader sr = new StreamReader(Server.MapPath("03122013114450.txt"), true))
{
   while (!sr.EndOfStream) {
       count++;
       String line = sr.ReadLine();
       if ((count % 2) == 0) {
           // do additional processing here
           // like insert row into database
       }
    }
}

(我的 C# 生锈了。)

于 2013-03-14T12:15:10.807 回答
1

另一个优化:

using (var sr = new StreamReader(Server.MapPath("03122013114450.txt"), true))
{
    var line = sr.ReadLine();
    while (line != null)
    {
        // Do stuff here. Add to the list, maybe?

        if (sr.ReadLine()!= null) //read the next line and ignore it.
            line = sr.ReadLine();
    }
}

如果要忽略奇数行而不是偶数行,请将line = sr.ReadLine();while 循环的末尾移动到开头

于 2013-03-14T12:19:08.070 回答