java - CSV 保留 CRLF 同时替换 LF

标签 java unix csv

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

"ID","NAME","CLASS"CRLF
"1","JOHN X","A"CRLF
"2","DOELF
Y","B"CRLF
"3","OTHER S", "D"CRLF

请注意,第 3 行以 LF 而不是 CRLF 结尾。在用 Java 读取此 CSV 文件时,我得到 5 行而不是 4 行(标题行 + 3 数据行)。有没有办法可以用空格替换 LF,同时保留 CRLF(修改输入文件或更改 java 代码)。我做了很多谷歌搜索,我可以看到每个解决方案都将 LF 与 CRLF 一起替换。

谢谢

最佳答案

您可以使用分隔符为 \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,参见 here .

关于java - CSV 保留 CRLF 同时替换 LF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18581618/

相关文章:

java - 如何阻止 Apache httpd 拒绝 HTTP PATCH 请求?

bash - 获取 UNIX 中文件列表的总大小

Linux sudo 更改用户

bash - 无法将 bash 输出到文件

c - 如何使用 sscanf 读取带有继续逗号的一行 csv

java - 当父类(super class)使用@Inject时,如何构造一个类?

java - 为什么 Spring 的 @Configurable 有时有效,有时无效?

ruby - 创建具有不同 key 的哈希数组的 CSV

java - java中的逗号吐出/分隔jsonnode

java - 我应该为我的 2D 滚动 map 使用什么缓冲策略?