2017-01-02 63 views
4

我想知道如何从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(); 
    } 
} 

语境

我生成使用http://jackcess.sourceforge.net/从Microsoft Access(.mdb)文件的CSV文件。当我生成csv并使用vim打开时,我会在行中看到很多^ M。注:我在MacOS

我曾尝试下面写到csv

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

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

之前删除^ M(我相信这是一个微软Windows CARRIAGE_RETURN)
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' 

任何帮助后

预期的输出将受到赞赏。

+0

看起来很奇怪,我的意思是,在一个看起来像一个数字的字段中有奇怪的字符。 –

+0

能否请您在阅读mdb后显示如何编写csv文件的确切代码? –

+0

@Würgspass - 更新代码 – amjad

回答

3

字符串是不可变的,所以.replaceAll方法不会更改现有字符串的值;它执行替换并返回一个新的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(在文本文件中开始新行)。

+0

Thanks @Grod。在压力下,我犯了一个愚蠢的错误。 – amjad