2017-01-02 61 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