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

C#-从CSV文件中读取,一次生成两个条目?,c#,csv,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 13

我试图从曾经的电子表格中读取数十万个值的列表,但为了简单起见,我已将其转换为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++;
            }
        }
    }
}
static void Main()
{
使用(var fs=File.OpenRead(@“C:\path\to\File.csv”))
使用(var read=新的StreamReader(fs))
{
而(!read.EndOfStream)
{
int i=0;
var line=read.ReadLine();
而(i<4)
{
var值=行分割(',');
Console.Write(值[i]);
Console.Read();
i++;
}
}
}
}
编辑:对不起,我在理解代码应该做什么时迷失了方向,忘了在这里解释目标

此程序用于获取这些值,并将文件从第四个值(例如104672)重命名为前三个值,用虚线分隔(例如0-0-0)。我现在想要从我的输出中看到的是程序一次一个地返回值,这样我就知道当我去重命名文件时,我不会得到不正确的结果


编辑2:一天后,我还意识到,我得到的答案对使我的程序正常运行具有重要意义,而不是真正发现为什么我会得到我得到的输出。对于未来好奇的人来说,答案基本上是Console.Read();不是真正的暂停,并导致按键时发生的写入次数超过预期

很难从代码中看出您认为它应该做什么。下面是一个版本,它将读取每一行,在逗号上拆分,并遍历这些值,打印每个值。打印一行的所有值后,它将打印一个新行。希望这就是你想要达到的目标

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();
        }
    }
}
static void Main()
{
使用(var fs=File.OpenRead(@“C:\path\to\File.csv”))
使用(var read=新的StreamReader(fs))
{
而(!read.EndOfStream)
{
int i=0;
var line=read.ReadLine();
var值=行分割(',');
而(i
一种更清晰易懂的方法是:

            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
                }
            }

正如@rory.ap所说,您有很多库可以直接阅读CSV。但是,如果你仍然想自己做这件事,似乎是在做一件简单的事情上付出了巨大的努力。试试这个:

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

如果您需要这些值供以后使用,为什么不将它们放入
列表中供以后使用。。。像这样:

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(','));                    
        }
    }
为什么不

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

为什么要编写自己的代码来解析CSV?如果您只需搜索,就有很多库可用于此目的。为什么您会怀疑
Console.Read()
每次按回车键时可能会在后续调用中捕获两个字符?因此,最终的解决方案是:切换到一个系统,在该系统中,换行符由单个字符表示,这样就可以了;)您想要的输出是什么?@rory.ap我非常习惯于发布自己的代码。这个程序最终将用于根据这些数字重命名文件。我同意@geek40。可能是
Console.Write(values[i])
后面跟着
Console.Read()
弄乱了您的输出。使用
控制台.WriteLine(值[i])
更改第一个,并将
Conosole.Read()
移出
内部
。我不熟悉C如何处理这个问题。我必须创建list类的新对象吗?@SMEAT对不起,我忘记创建list的实例了。编辑了我的答案。
line number: 1, contents: 0 0 0 104672
line number: 2, contents: 0 1 6 51971
line number: 3, contents: 0 1 36 80212
line number: 4, contents: 0 2 5 51972
line number: 5, contents: 0 2 13 51973
foreach (var line in File.ReadLines(@"C:\path\to\file.csv"))    
    foreach (var segment in line.Split(','))        
        Console.WriteLine(segment);