C# - 按字符读取外部CSV文件字符

时间:2012-03-08 10:45:02

标签: c# .net file stream

在C#中逐个字符读取文件的最简单方法是什么?

目前,我正在通过调用System.io.file.ReadLine()逐行阅读。我看到有一个Read()函数,但它没有;返回一个字符...

我还想知道如何使用这种方法检测一行的结尾......有问题的输入文件是一个CSV文件....

2 个答案:

答案 0 :(得分:5)

打开TextReader(例如File.OpenText - 请注意File是一个静态类,因此无法创建它的实例)和反复拨打Read。这将返回int而不是char,因此它表示文件结尾:

int readResult = reader.Read();
if (readResult != -1)
{
    char nextChar = (char) readResult;
    // ...
}

或循环:

int readResult;
while ((readResult = reader.Read()) != -1)
{
    char nextChar = (char) readResult;
    // ...
}

或者更加时髦的善良:

public static IEnumerable<char> ReadCharacters(string filename)
{
    using (var reader = File.OpenText(filename))
    {
        int readResult;
        while ((readResult = reader.Read()) != -1)
        {
            yield return (char) readResult;
        }
    }
}

...

foreach (char c in ReadCharacters("foo.txt"))
{
    ...
}

请注意,默认情况下,File.OpenText都将使用UTF-8编码。如果这不是您想要的,请明确指定编码。

编辑:要查找某一行的结尾,您需要检查该字符是否为\n ...您可能也想要特别处理\r,如果这是一个Windows文本文件。

但是如果你想要每个,为什么不调用ReadLine?您可以随后迭代该行中的字符...

答案 1 :(得分:0)

以下是msdn

的摘录
using (StreamReader sr = new StreamReader(path))
{
    char[] c = null;

    while (sr.Peek() >= 0)
    {
        c = new char[1];
        sr.Read(c, 0, c.Length);

        // do something with c[0]
    }
}