在ReadAllLines方法中如何区分换行和回车?

我写的是重写CSV文件到Excel电子表格的程序。 我需要二维数组来写入文本到Excel中,所以我使用File.ReadAllLines和在foreach line.Split方法为它,它的工作完美。 问题是,当我们想要在Excel单元格内进行换行时 – ReadAllLines被换行和回车的方式相同,所以我们在Excel中也会有不同的单元格。

问题是,有什么办法可以重写这个方法,我们可以把LF和CR区分开来? 例如,什么时候LF不创build新行,所以列表中的新元素,只要将它附加到以前的string与某种types的标识为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; } 

不,你不能覆盖这个行为。

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

一行被定义为一个字符序列,后跟一个回车符('\ r'),一个换行符('\ n'),或者一个回车符后跟一个换行符

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

然而,你可以使用File.ReadAllText(...) ,然后分割\r ,例如:

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

但是请记住,除非您的数据是非常严格创build的,否则这实际上不是处理CSV数据的好方法。 诸如Lumenworks CSV Reader或TextFieldParser之类的库更适合“现实世界”数据,因为它正确处理分隔符和文本环绕。 不过,我不知道任何允许你改变行分隔符。