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

时间:2016-02-23 20:30:38

标签: c#

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

string test = File.ReadAllText(path).Split(',');

如果我使用类似

的for循环打印该数组
for(i=0;i<93;i++;)
{
    Console.WriteLine(test[i]);
}

输出打印93项,如果我使i <94,则打印95项。请解释发生了什么,以及如何只打印出94件物品。

2 个答案:

答案 0 :(得分:1)

你还在写出94个项目,只是第94个项目中有一个换行符,所以它会写出95行。所以看起来像

的文件
  

1,2,3

     

4,5,6

将为您的代码生成一个值为1,2,3 \ n4,5和6的数组。其中\ n是换行符。打印出第3个值将导致2行而不是1行,从而使它看起来总共有6个项目,而实际上只有5个。

如果您想分开这些行,您可以执行以下操作

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

对于上面的示例,将3和4分成单独的项目,如果循环到第3项,则只能得到3而不是3 \ n4。此外,通过使用ReadLinesReadAllLinesReadAllText,您不会立即将整个文件加载到内存中。它将一次读取一行,拆分它,然后在迭代生成的IEnumerable<string>时读取下一行。对于小文件来说并不是什么大不了的事,但是可以避免使用大文件耗尽内存。

答案 1 :(得分:0)

你不应该对数字进行硬编码。 93,94,无论如何。

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

    foreach (string s in words)
    {
        System.Console.WriteLine(s);
    }

OR(不太喜欢)

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

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

我会一起避免这一切。

您可以谷歌“C#CVS”并找到许多第三方帮助者。

或者您可以使用此“.Net”(使用VB.NET程序集)(注意,您必须引用Microsoft.VisualBasic.dll)

https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx

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");
    }
}

}