Java CSV保留CRLF,同时更换LF

Java CSV保留CRLF,同时更换LF,java,unix,csv,Java,Unix,Csv,我有一个csv文件,如下所示(粗体控制字符) “ID”、“名称”、“类别”CRLF “1”、“JOHN X”、“A”CRLF “2”、“DOELF” Y、B、CRLF “3”、“其他S”、“D”CRLF 请注意,第3行以LF结尾,而不是CRLF。在Java中读取这个CSV文件时,我得到了5行而不是4行(标题行+3数据行)。有没有一种方法可以在保留CRLF的同时将LF替换为空格(要么修改输入文件,要么修改java代码)。我在谷歌上搜索了很多次,我发现每个解决方案都会用CRLF替换LF 谢谢您可以使

我有一个csv文件,如下所示(粗体控制字符)

“ID”、“名称”、“类别”CRLF “1”、“JOHN X”、“A”CRLF “2”、“DOELF” Y、B、CRLF “3”、“其他S”、“D”CRLF 请注意,第3行以LF结尾,而不是CRLF。在Java中读取这个CSV文件时,我得到了5行而不是4行(标题行+3数据行)。有没有一种方法可以在保留CRLF的同时将LF替换为空格(要么修改输入文件,要么修改java代码)。我在谷歌上搜索了很多次,我发现每个解决方案都会用CRLF替换LF


谢谢

您可以使用分隔符为
\n
扫描仪
。使用jlordo的技术去除
LF
,您可以将内容一次写入一行
OutputStream
。这样,您就不会将整个2GB+文件存储在内存中

public static void main(String[] args) throws Exception {   
    File file = new File("C:\\Users\\Soto\\Downloads\\person.xml");
    Scanner scanner = new Scanner(new FileInputStream(file));
    String lineSeparator = System.getProperty("line.separator"); // Assuming you are on Windows, otherwise set it to \n
    scanner.useDelimiter(lineSeparator);
    ByteArrayOutputStream out = new ByteArrayOutputStream(); // would be a real outputstream, like FileOutputStream
    char LF = 0xA; 

    while (scanner.hasNext()) { // looks up to the next delimiter
        String line = scanner.next();
        line = line.replace("" + LF, "");
        out.write(line.getBytes());
        out.write(lineSeparator.getBytes());
    }

    // the OutputStream now contains the content with new lines but no LF
}

LF
是十六进制
A
,请参阅。

您可以使用分隔符为
\n
扫描仪。使用jlordo的技术去除
LF
,您可以将内容一次写入一行
OutputStream
。这样,您就不会将整个2GB+文件存储在内存中

public static void main(String[] args) throws Exception {   
    File file = new File("C:\\Users\\Soto\\Downloads\\person.xml");
    Scanner scanner = new Scanner(new FileInputStream(file));
    String lineSeparator = System.getProperty("line.separator"); // Assuming you are on Windows, otherwise set it to \n
    scanner.useDelimiter(lineSeparator);
    ByteArrayOutputStream out = new ByteArrayOutputStream(); // would be a real outputstream, like FileOutputStream
    char LF = 0xA; 

    while (scanner.hasNext()) { // looks up to the next delimiter
        String line = scanner.next();
        line = line.replace("" + LF, "");
        out.write(line.getBytes());
        out.write(lineSeparator.getBytes());
    }

    // the OutputStream now contains the content with new lines but no LF
}
LF
是十六进制
A
,请参阅。

这应该可以:

char LF = 0x0A;
char CR = 0x0D;
String content = ... // your lines(s)
content = content.replaceAll("(?<!" + CR + ")" + LF, " ");
charlf=0x0A;
字符CR=0x0D;
字符串内容=…//你的台词
content=content.replaceAll(“(?这应该可以:

char LF = 0x0A;
char CR = 0x0D;
String content = ... // your lines(s)
content = content.replaceAll("(?<!" + CR + ")" + LF, " ");
charlf=0x0A;
字符CR=0x0D;
字符串内容=…//您的行

content=content.replaceAll((?您必须设置正确的系统属性(line.separator),如下所述:

希望它能解决问题。
干杯

您必须设置正确的系统属性(line.separator),如下所述:

希望它能解决问题。

干杯

dos2unix将所有CRLF转换为LF。但是我需要删除所有LF并保留CRLF。您测试了我的答案吗?@jlordo,您的解决方案包括将文件的全部内容读入字符串,但我的文件大小约为2GB。很抱歉,我忘了在主要部分提到文件大小post@jdev.hari当前位置你为什么不读几行直到找到答案以CRLF结尾的e?@nneonneo java api只会在看起来是CRLF或LF时返回行。一旦读取到行分隔符是什么,就无法确定。dos2unix将所有CRLF转换为LF。但是我需要删除所有LF并保留CRLF。您测试过我的答案吗?@jlordo,您的解决方案包括读取将文件转换为字符串,但我的文件大小约为2GB。很抱歉,我忘记在主文件中提及文件大小post@jdev.hari:在找到以CRLF结尾的行之前,为什么不直接读取该行?@nnonneo java api只会在显示为CRLF或LF时返回该行。一旦读取该行,就无法确定该行分隔符是什么。如果LF被系统行分隔符替换,我将在Java中读取5行。我只想读取4行,即LF不应被视为行分隔符。我愿意通过unix命令修改输入文件或修改Java文件读取逻辑。@jdev.hari我似乎误解了目标。您想用LF
?请稍等。@jdev.hari上述方法应该有效。您可以写入新的
OutputStream
(可能是临时文件)这样你就不会把整个文件都放在内存中。@jdev.hari有什么进展吗?如果LF被系统行分隔符替换,我最终会在Java中读5行。我只想读4行,即LF不应被视为行分隔符。我愿意通过unix命令修改输入文件或修改Java文件读取逻辑。@jdev.hari误解了目标。你想用
LF
删除这行吗?请稍等。@jdev.hari上面的方法应该可以。你可以写一个新的
OutputStream
(可能是一个临时文件),这样你就不会把整个文件都放在内存中。@jdev.hari有什么进展吗?@SotiriosDelimanolis:OP是这么说的:“有没有一种方法可以在保留
CRLF
的同时用空格替换
LF
”……这正是我的答案。@SotiriosDelimanolis如果我的问题让人困惑,我很抱歉。我不想替换整行,但只想去掉LF,即Java将第2行视为“2”、“DOE Y”、“B”“@SotiriosDelimanolis:我的答案在逻辑上是正确的,但OP没有提到他的文件是2GB大的,所以我的答案不实用,因为它涉及到将整个文件读入字符串变量。@SotiriosDelimanolis:OP是这么说的:“有没有办法在保留
CRLF
的同时用空格替换
LF
”…这正是我的答案。@SotiriosDelimanolis如果我的问题让人困惑,我很抱歉。我不想替换整行内容,但如果Java将第2行视为“2”、“DOE Y”、“B”,请将其删除@SotiriosDelimanolis:我的答案在逻辑上是正确的,但OP没有提到他的文件是2GB大的,所以我的答案不实用,因为它涉及到将整个内容读入字符串变量。