为什么解析CSV或TSV文件时只能得到部分结果?

本文关键字:结果 CSV 文件 TSV 为什么 | 更新日期: 2023-09-27 18:04:28

我试图从100行CSV文件中获得第二个值。我得到了前42个值,然后它停止了…没有错误消息,也没有错误处理。我很困惑,在一个时间轴上。它也会对TSV文件执行此操作,但会给出前43个结果。如果你觉得很奇怪,请告诉我。

我使用streamreader,将每行读取为字符串数组,分割数组并将第二个值添加到列表中…

        string path = @"C:'Users'dave'Desktop'codes'testfile.txt";
        StreamReader sr = new StreamReader(path);
        List<string> stkno = new List<string>();
        foreach (var line in path)
        {
            string s = sr.ReadLine();
            string[] words = s.Split(',');
            stkno.Add(words[1]);
        }
        var message = string.Join(",", stkno.ToArray());
        MessageBox.Show(message);

为什么解析CSV或TSV文件时只能得到部分结果?

您的path变量是一个字符串。这意味着当你对它进行foreach时,你会得到一个字符序列 - 'C'然后':'然后'''等等。我不认为那是你想要做的……

这里有一个使用File.ReadLines的更简单的方法:

string path = @"C:'Users'dave'Desktop'codes'testfile.txt";
List<string> stkno = (from line in File.ReadLines(path)
                      let words = line.Split(',')
                      select words[1]).ToList();

或:

string path = @"C:'Users'dave'Desktop'codes'testfile.txt";
List<string> stkno = File.ReadLines(path)
                         .Select(line => line.Split(',')[1])
                         .ToList();

如果你正在使用。net 3.5并且你不介意一次读取整个文件,你可以使用File.ReadAllLines来代替。

您意外地遍历了文件路径中的字符数,而不是字符串中的行数。这个更改应该修复:

    string path = @"C:'Users'dave'Desktop'codes'testfile.txt";
    StreamReader sr = new StreamReader(path);
    List<string> stkno = new List<string>();
    while (sr.Peek() >= 0) 
    {
        string s = sr.ReadLine();
        string[] words = s.Split(',');
        stkno.Add(words[1]);
    }
    var message = string.Join(",", stkno.ToArray());
    MessageBox.Show(message);

这个怎么样:

    string path = @"C:'Users'dave'Desktop'codes'testfile.txt";
    var secondWords = from line in File.ReadAllLines(path)
                        let words = line.Split(',')
                        select words[1];
    var message = string.Join(",", secondWords.ToArray());

我想你的意思是:

    string path = @"C:'Users'dave'Desktop'codes'testfile.txt";
    StreamReader sr = new StreamReader(path);
    List<string> stkno = new List<string>();
    string s;
    while(s = sr.ReadLine() != null)
    {
        string[] words = s.Split(',');
        stkno.Add(words[1]);
    }
    var message = string.Join(",", stkno.ToArray());
    MessageBox.Show(message);