C# - 从CSV文件中读取一次产生两个条目?

时间:2017-04-19 13:02:26

标签: c# csv

我试图从曾经是电子表格的数十万个值列表中读取,但为了简单起见,我已经变成了一个CSV文件。

我的问题是,在测试它以确保它正确读取时,代码是出于某种原因忽略了第二个位置后的逗号,并将该点中的值与其旁边的值组合,尽管是,你知道,以逗号分隔。它也开始将最终值与下一组中的第一个值组合在一起。

例如:

CSV文件:

0,0,0,104672
0,1,6,51971
0,1,36,80212
0,2,5,51972
0,2,13,51973
...

节目输出:

0
00
1046720
00
16
519710
136
...

我认为这个例子可能比我在文字中做的更好地描述了正在发生的事情。它继续这样,显示错误的信息,直到它到达文件的末尾。

我的代码如下:

static void Main()
{
    using(var fs = File.OpenRead(@"C:\path\to\file.csv"))
    using(var read = new StreamReader(fs))
    {
        while (!read.EndOfStream)
        {
            int i = 0;
            var line = read.ReadLine();
            while (i < 4)
            {
                var values = line.Split(',');
                Console.Write(values[i]);
                Console.Read();
                i++;
            }
        }
    }
}
编辑:对不起,我对代码应该做什么的理解迷失了,忘记在这里解释目标。

此程序用于获取这些值并将文件从第4个值(例如,104672)重命名为前三个值,用短划线(例如0-0-0)分隔。我现在想要输出的是能够看到程序一次给我一个值,这样我知道当我重命名文件时,我没有得到不正确的结果。

编辑2:我也意识到,一天之后,我得到的答案对于使我的程序工作非常重要,而不是实际发现我获得输出的原因。对于那些将来好奇的人来说,答案基本上就是Console.Read();不是一个真正的暂停,并导致更多的写入发生在按键上超过预期。

5 个答案:

答案 0 :(得分:2)

更清晰易懂的方法是:

            using (StreamReader sr = new StreamReader(@"C:\path\to\file.csv"))
            {
                string currentLine;
                while((currentLine = sr.ReadLine()) != null)
                {
                    string[] lineArr = line.Split(',');
                    foreach(string subLine in lineArr)
                    {
                        Console.WriteLine(subline);
                    }
                    Console.Read(); // Awaits user input in order to proceed
                }
            }

答案 1 :(得分:0)

很难从你的代码中看出你认为它应该做什么。这是一个版本,它将读取每一行,将其拆分为逗号,并迭代值,打印每个值。打印一行后的所有值后,将打印一个新行。希望这就像你想要实现的那样。

static void Main()
{
    using(var fs = File.OpenRead(@"C:\path\to\file.csv"))
    using(var read = new StreamReader(fs))
    {
        while (!read.EndOfStream)
        {
            int i = 0;
            var line = read.ReadLine();
            var values = line.Split(',');
            while (i < values.Length)
            {
                Console.Write(values[i]);
                //Console.Read();
                i++;
            }
            Console.WriteLine();
        }
    }
}

答案 2 :(得分:0)

正如@ rory.ap所说,你有很多库可以直接读取CSV。但是如果您仍然希望自己做这件事,似乎正在花费大量精力完成一项简单的任务。试试这个:

        using (StreamReader reader = new StreamReader("C:/yourpath/yourfile.csv"))
        {
            while (reader.Peek() >= 0)
            {
                string line = reader.ReadLine();
                string[] yourData = line.Split(',');
            }
        }

答案 3 :(得分:0)

如果您需要这些值供以后使用,为什么不将它们放入import urllib link = 'https://automatetheboringstuff.com/chapter7/' f = urllib.request.urlopen(link) myfile = f.read() print(myfile) 以供日后使用......像这样:

List

稍后,您可以使用列表中的数据:

List<string[]> listOfValues = new List<string[]>();
using (var fs = File.OpenRead(@"C:\temp\csv.txt"))
    using (var read = new StreamReader(fs))
    {
        while (!read.EndOfStream)
        {
            var line = read.ReadLine();
            listOfValues.Add(line.Split(','));                    
        }
    }

给你

for (int i = 0; i<listOfValues.Count; i++)
{
    Console.WriteLine("line number: {0}, contents: {1}", i + 1, string.Join(" ", listOfValues[i]));
}

答案 4 :(得分:0)

为什么不

foreach (var line in File.ReadLines(@"C:\path\to\file.csv"))    
    foreach (var segment in line.Split(','))        
        Console.WriteLine(segment);