如何使用 Java 从独立于平台的文本文件中删除 ^M 字符?

Posted

技术标签:

【中文标题】如何使用 Java 从独立于平台的文本文件中删除 ^M 字符?【英文标题】:How to remove ^M characters from a text file independent of platform using Java? 【发布时间】:2017-01-02 09:39:30 【问题描述】:

我正在尝试弄清楚如何从使用以下代码的 Java 代码生成的文本文件中删除 ^M 个字符。

   public StringBuilder toCsv(Table table) 
        StringBuilder stringBuilder = new StringBuilder();
        String csv = new String();
        for (Column cName : table.getColumns())
            csv += QUOT;
            csv += cName.getName();
            csv += QUOT;
            csv += CSV_SEPERATOR;
        

        csv += "\n";
        stringBuilder.append(csv);

        for (Row row : table) 
            Collection<Object> values = row.values();
            String csvString = "";
            if (values.size() == 10) 
                String ep = QUOT + CSV_SEPERATOR + QUOT ;
                csvString = StringUtils.join(row.values(),ep );
                csvString.replaceAll("\'", "");
                csvString = QUOT + csvString + QUOT;
                logger.info("line ++++ " + csvString);
            
            stringBuilder.append(csvString);
            stringBuilder.append("\n");
        

        return stringBuilder;
     

然后我使用以下方法将数据写入文件

 public void writeCsv(String data, String path, String fileName) throws IOException 
    String completePath = path + "/" + fileName;
    Writer out = new BufferedWriter(new OutputStreamWriter(
            new FileOutputStream(completePath)));
    try 
        out.write(data);
     finally 
        out.close();
    

上下文

我正在使用来自 Microsoft 访问 (.mdb) 文件的 http://jackcess.sourceforge.net/ 生成 CSV 文件。当我生成 csv 并使用 vim 打开时,我在行中间看到很多 ^M。注意:我在 MacOS 上

我已尝试在写入 csv 之前删除 ^M(我相信这是一个 MS Windows CARRIAGE_RETURN)

 csvLine.replaceAll("\n\r", "");

 csvLine.replaceAll("\r\n", "");

csvLine.replaceAll("\\r", "");

生成的 CSV

'10773.0';'';'';'';'Thu Jul 14 00:00:00 CEST 2016';'By Cash';'';'10000.0';'';'2102.0'
    '10001.0';'';'';'';'Thu Jul 14 00:00:00 CEST 2016';'Pet Soup cash';'087470^M
        ^M
        ^M
087470';'-45000.0';'';'2102.0'
'10360.0';'';'';'';'Thu Jul 14 00:00:00 CEST 2016';'By Cash';'';'37000.0';'';'2101.0'
'10444.0';'';'';'';'Thu Jul 14 00:00:00 CEST 2016';'By Cash';'';'2000.0';'';'2101.0'

如您所见,上面 CSV 中的一行被 ^M 打破,这是不希望的。 我需要以编程方式从文件中删除此类字符。

删除 ^M 并继续行后的预期输出

'10001.0';'';'';'';'Thu Jul 14 00:00:00 CEST 2016';'Pet Soup cash';'087470087470';'-45000.0';'';'2102.0'

任何帮助将不胜感激。

【问题讨论】:

看起来很奇怪,我的意思是,在一个看起来像数字的字段中有奇怪的字符。 能否请您显示从 mdb 读取后如何编写 csv 文件的确切代码? @Würgspass - 更新代码 【参考方案1】:

字符串是不可变的,所以.replaceAll方法不会改变现有字符串的值;它执行替换并返回一个新的字符串值。所以,

String csvString = "123,foo,234";
csvString.replaceAll("foo", "");
System.out.println(csvString);

打印

123,foo,234

显示字符串没有改变。你想做的是

String csvString = "123,foo,234";
csvString = csvString.replaceAll("foo", "");  // save the new value
System.out.println(csvString);

打印出来的

123,,234

在您的特定情况下,您似乎想要这样做

csvString = csvString.replaceAll("\r\n", "");  // save the new value

因为您想删除 both 回车(显示为 ^M)和新行(在文本文件中开始新行)。

【讨论】:

以上是关于如何使用 Java 从独立于平台的文本文件中删除 ^M 字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何从Java中的文件中删除换行符?

从独立于开源平台的 Java 代码替换 Windows *.exe 中的图标

如何在 C++ 中编写独立于平台的包装函数 [重复]

如何使用 SkiaSharp 加载“独立于平台”的图像?

java 删除文件中的数据

比较从文本文件中读取的并行数组