2016-02-05 38 views
1

我有两个文件除了行结束码以外都是相同的。使用换行符(linux/Unix)的字符工作(读取所有550行数据),使用换行符和换行符(Windows)在读取269行后停止返回行。在这两种情况下,数据都可以正确读取到它们停止的位置。 如果我在失败的文件上运行dos2unix,则生成的文件有效。在窗口上使用com.opencsv.CSVReader会提前停止读取线条

我希望能够读取CSV文件,而不管它们的来源。如果我至少能够在读取部分数据之前检测到文件格式错误 即使我可以在阅读文件的过程中随时告诉它它不起作用,我可以输出一个错误。 我目前阅读文件的一半状态并终止没有错误是危险的。

回答

0

问题在于,openCSV使用了一个BufferedReader which reads a line from the stream until it gets to the Systems line.seperator

如果您事先知道该文件的行分隔符是在您的应用程序中,只需执行System.setProperty(“line.separator”,newLine),其中newLine是“\ n”或“\ r \ n”基于你将要解析的文件。或者您可以将其作为参数传入。

如果您想自动检测文件字符。创建一个方法来获取你想要的文件,创建一个BufferedReader并读取一行。如果最后一个字符是'\ r',那么你的系统系统使用“\ n”,但是你想把它设置为“\ r \ n”。否则,如果line.contains(“\ n”)返回true,那么你在使用“\ r \ n”的系统上,并且想将其设置为“\ n”。否则,系统和您正在阅读的文件具有兼容的换行符。

请注意,如果您要更改系统换行符,请务必在处理完文件后将其设回,以防您的程序正在处理多个文件。

+0

另外,其他CSV库在不需要额外工作的情况下可以统一处理各种换行。因此,如果不需要专门使用OpenCSV,则可以使用像Jackson的CSV模块(https://github.com/FasterXML/jackson-dataformat-csv)这样的替代方法。 – StaxMan

+0

这看起来很不错。我对OpenCSV没有要求,也没有任何必须完美工作的csv文件范围的控制权,所以Jackson-dataformat-csv看起来很有前途。谢谢。 – Ron