2017-04-09 56 views
-2

我因爲會閱讀下列文件:如何CSV解析可以利用 - JAVA

"String",int,int 
"String",int,int 
"String",int,int 
... 

由於未知數量的變量,一個而(scanner.hasNextLine())可以解決到條目的數量。我的目標是獲取這三部分數據並將它們存儲到一個節點中。我正在使用方法BinaryTree.addNode(String,int,int)爲此。我正在嘗試讀取數據時遇到問題。我想在文檔中刪除逗號,然後嘗試使用重新讀取數據如下:

Scanner firstpass = new Scanner(file); 
String input = firstpass.nextLine().replaceAll(",", ""); 
Scanner secondpass = new Scanner(input); 
String variable1 = secondpass.next(); 
int variable2 = secondpass.nextInt(); 
int variable3 = secondpass.nextInt(); 

然而,這是要對這個非常innefective方式。

修訂 的編譯錯誤可以固定如下:

try { 
      Scanner scanner1 = new Scanner(file); 
      while (scanner1.hasNextLine()) { 
       String inventory = scanner1.nextLine().replaceAll(",", " "); 
       Scanner scanner2 = new Scanner(inventory); 
       while (scanner2.hasNext()){ 
        String i = scanner2.next(); 
        System.out.print(i); 
       } 
       scanner2.close(); 
      } 
      scanner1.close(); 
     } 
     catch (FileNotFoundException ex) { 
      ex.printStackTrace(); 
     } 

這使我的輸出: 「字符串」 intint 「字符串」 intint 「字符串」 intint ... 所以我知道我在正確的軌道上。然而,「String」變量中的任何(空格)都被刪除。所以他們會輸出「SomeString」而不是「Some String」。另外我還不知道如何從字符串中刪除「」。

+3

使用合適的csv庫 –

回答

0

你顯示的格式CSV (Comma-Separated Values)格式相匹配,所以你最好的選擇是使用CSV解析器,例如Apache Commons CSV ™

如果您不想添加第三方庫,則可以使用Regular Expression來解析該行。從文件

讀線應該與一個Scanner完成。改爲使用BufferedReader。見Scanner vs. BufferedReader

try (BufferedReader in = new BufferedReader(new FileReader(file))) { 
    Pattern p = Pattern.compile("\"(.*?)\",(-?\\d+),(-?\\d+)"); 
    for (String line; (line = in.readLine()) != null;) { 
     Matcher m = p.matcher(line); 
     if (! m.matches()) 
      throw new IOException("Invalid line: " + line); 
     String value1 = m.group(1); 
     int value2 = Integer.parseInt(m.group(2)); 
     int value3 = Integer.parseInt(m.group(3)); 
     // use values here 
    } 
} catch (IOException | NumberFormatException ex) { 
    ex.printStackTrace(); 
} 

請注意,如果字符串包含轉義字符,例如,如果它包含嵌入的雙引號。爲此,您應該使用解析器庫。

上面的代碼將正確處理嵌入的空格和逗號。

+0

感謝您向我介紹這種CSV格式。我以前從來沒有聽說過。或者,也許我已經忘記了。我也考慮過掃描儀與BufferedReader/Writer的使用,所以我也很欣賞這個參考。 –

0

我會的,而不是使用

String input = firstpass.nextLine().replaceAll(",", ""); 
Scanner secondpass = new Scanner(input); 
String variable1 = secondpass.next(); 
int variable2 = secondpass.nextInt(); 
int variable3 = secondpass.nextInt(); 

用下面的辦法

String line = firstpass.nextLine(); 
String[] temp = line.split(","); 
String variable1 = temp[0]; 
int variable2 = Integer.parseInt(temp[1]); 
int variable3 = Integer.parseInt(temp[2]); 
+0

如果字符串中有逗號,該怎麼辦? – Andreas

+0

我沒有在原始發佈中提到這個,但是如果我的字符串中有一個空格,是否有一種方法可以實現? –