C#-从CSV文件中读取,一次生成两个条目?
我试图从曾经的电子表格中读取数十万个值的列表,但为了简单起见,我已将其转换为CSV文件 我的问题是,在测试代码以确保其正确读取时,代码出于某种原因忽略了第二个位置后的逗号,并将该位置处的值与其旁边的值相结合,尽管它们之间用逗号分隔。它还开始将最终值与下一组中的第一个值组合 例如: 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
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);