编程语言
首页 > 编程语言> > 如何使用Java从独立于平台的文本文件中删除^ M个字符?

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

作者:互联网

我试图找出如何从使用以下代码的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'

任何帮助将不胜感激.

解决方法:

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

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

因为你想删除carriage_return(显示为^ M)和new_line(在文本文件中开始一个新行).

标签:java,java-8,jackcess
来源: https://codeday.me/bug/20190627/1308725.html