【问题标题】:How to distinguish Line feed and Carriage Return in ReadAllLines method?ReadAllLines 方法中如何区分换行和回车?
【发布时间】:2017-03-10 05:52:09
【问题描述】:

我正在编写将 CSV 文件重写到 excel 电子表格的程序。我需要二维数组将文本写入 excel,所以我使用 File.ReadAllLines 和 foreach line.Split 方法,它工作得很好。问题是,当我们想在 excel 单元格内换行时 - ReadAllLines 以相同的方式处理换行和回车,所以我们将在 excel 中使用不同的单元格换行。

问题是,有什么方法可以覆盖这个方法,我们可以区分LF和CR吗?例如,LF什么时候不创建新行,所以列表中的新元素,只需将其附加到带有某种excel标识符的前一个字符串。

这是我读取文件的方式:

public virtual List<List<string>> Read(string inFile)
    {
        var sheetData = new List<List<string>>();

            if (!File.Exists(inFile))
            {
                FileDoesNotExist(inFile);
                return sheetData;
            }
            var lines = File.ReadAllLines(inFile);

            foreach (var line in lines)
            {
                var cells = line.Split(_delimiter).ToList();
                sheetData.Add(cells);
            }

        return sheetData;

    }

【问题讨论】:

标签: c# excel file csv text


【解决方案1】:

不,您不能覆盖此行为。

File.ReadAllLines(...) 的文档指出:

行定义为一系列字符,后跟回车符 ('\r')、换行符 ('\n') 或回车符后紧跟换行符

File.ReadAllLines 使用StreamReader 来实现它,而StreamReader.ReadLine(...) 被硬编码为使用\r\n\r\n

但是,您可以使用File.ReadAllText(...),然后在\r 上拆分,例如:

string[] lines = File.ReadAllText(inFile).Split('\r');

但是请记住,除非您的数据是非常严格地创建的,否则这实际上并不是处理 CSV 数据的好方法。 Lumenworks CSV ReaderTextFieldParser 之类的库更适合“真实世界”数据,因为它可以正确处理分隔符和文本环绕。但是我不知道有什么可以让您更改行分隔符。

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 2012-09-05
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多