C# 从文件中提取数据后写入控制台时的额外数据

C# 从文件中提取数据后写入控制台时的额外数据,c#,C#,我有一个文件,文件中的值用逗号分隔,我使用下面的代码将其加载到字符串数组中 string test = File.ReadAllText(path).Split(','); 如果我使用for循环打印数组,比如 for(i=0;i<93;i++;) { Console.WriteLine(test[i]); } (i=0;i你不应该硬编码一个数字 string[] words = File.ReadAllText(path).Split(','); foreac

我有一个文件,文件中的值用逗号分隔,我使用下面的代码将其加载到字符串数组中

string test = File.ReadAllText(path).Split(',');
如果我使用for循环打印数组,比如

for(i=0;i<93;i++;)
{
    Console.WriteLine(test[i]);
}

(i=0;i你不应该硬编码一个数字

    string[] words = File.ReadAllText(path).Split(',');

    foreach (string s in words)
    {
        System.Console.WriteLine(s);
    }
或(不太受欢迎)


}

您仍然在写94个项目,只是第94个项目中有一个换行符,因此它将导致写95行

1,2,3

4,5,6

将为代码生成一个值为1、2、3\n4、5和6的数组。其中\n是换行符。打印出第三个值将生成2行而不是1行,因此看起来好像总共有6项,而实际上只有5项

如果要在这些行上分开,可以执行以下操作

var values = File.ReadLines(path).SelectMany(line=>line.Split(','));

在上面的例子中,这将把3和4分为单独的项目,如果循环到第3个项目,则只会得到3而不是3\n4。此外,通过使用
ReadLines
ReadAllLines
ReadAllText
相比,您不会一次将整个文件加载到内存中。相反,它会一次读取一行,即拆分在迭代生成的
IEnumerable
时读取下一个符号。对于小文件来说没什么大不了的,但可以避免使用大文件时内存不足。

这可能是因为unicode字符,其中一些符号存储为两个字节而不是一个字节,但用一个字符直观地表示一个94次迭代的循环并不存在t打印95个项目。我认为您在第94个项目中有一个换行符,因此看起来像两个项目。@user853710:他从未将数据视为字节数组,因此情况并非如此。对于CSV文件,可能更清楚地看到
ReadAllLines
然后
。拆分每个项目。此外,您是否检查了是否有那么多项目?还有由于无法将
String[]
分配给
String
,因此无法编译。可以执行
var values=File.ReadAllLines(path)。选择many(line=>line.Split(','))
获取所有以行和逗号分隔的值。我不想打印数组中的所有项,只打印其中的一部分them@Timothy这就足够让你开始了。如果你想打印一些项目,那么你需要为你想跳过的项目添加一些
if(){}
conditional。请在“foreach”中显示一些努力对数据进行检查。你的问题需要更多的细节。此外,如果你正在解析CSV文件,有更好的方法来分解数据。这仍然没有触及OP问题的根源,即他们看到95行,因为第94项有一个换行符。修复方法是在换行符和逗号上进行拆分。这是缺乏理解为了将来参考,我如何使用foreach只打印数组的特定部分?
using (Microsoft.VisualBasic.FileIO.TextFieldParser MyReader = new Microsoft.VisualBasic.FileIO.TextFieldParser("c:\\logs\\bigfile")) {

MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
MyReader.Delimiters = new string[] { Constants.vbTab };
string[] currentRow = null;
//Loop through all of the fields in the file. 
//If any lines are corrupt, report an error and continue parsing. 
while (!MyReader.EndOfData) {
    try {
        currentRow = MyReader.ReadFields();
        // Include code here to handle the row.
    } catch (Microsoft.VisualBasic.FileIO.MalformedLineException ex) {
        Interaction.MsgBox("Line " + ex.Message + " is invalid.  Skipping");
    }
}
var values = File.ReadLines(path).SelectMany(line=>line.Split(','));