2014-01-23 119 views
0

這是我發現的一些代碼,用於在2D數組中讀取數據,但是我遇到的問題是隻有在閱讀數字列表:Java從文件中讀取二維數組,用逗號分隔的數字

73 
56 
30 
75 
80 
ect.. 

我要的是能夠讀取那些結構類似這樣的多行:

1,0,1,1,0,1,0,1,0,1 
1,0,0,1,0,0,0,1,0,1 
1,1,0,1,0,1,0,1,1,1 

我只是想基本上導入每一行作爲一個數組,而像一個數組構造它們在文本文件中。 我讀過的所有東西都說要使用scan.usedelimiter(「,」);但在任何地方我嘗試使用它,程序會直接回復「回答」轉換錯誤號碼「。如果任何人都可以幫助,我將不勝感激。我還看到了一些關於使用緩衝讀取器的分割的信息,但我不知道哪些會更好地使用/爲什麼/如何。

String filename = "res/test.txt"; // Finds the file you want to test. 


    try{ 
     FileReader ConnectionToFile = new FileReader(filename); 
     BufferedReader read = new BufferedReader(ConnectionToFile); 
     Scanner scan = new Scanner(read); 

     int[][] Spaces = new int[10][10]; 
     int counter = 0; 
     try{ 
      while(scan.hasNext() && counter < 10) 
      { 
       for(int i = 0; i < 10; i++) 
       { 
        counter = counter + 1; 
        for(int m = 0; m < 10; m++) 
        { 
         Spaces[i][m] = scan.nextInt(); 
        } 
       } 
      } 
      for(int i = 0; i < 10; i++) 
      { 
       //Prints out Arrays to the Console, (not needed in final) 
       System.out.println("Array" + (i + 1) + " is: " + Spaces[i][0] + ", " + Spaces[i][1] + ", " + Spaces[i][2] + ", " + Spaces[i][3] + ", " + Spaces[i][4] + ", " + Spaces[i][5] + ", " + Spaces[i][6]+ ", " + Spaces[i][7]+ ", " + Spaces[i][8]+ ", " + Spaces[i][9]); 
      } 
     } 
     catch(InputMismatchException e) 
     { 
      System.out.println("Error converting number"); 
     } 
     scan.close(); 
     read.close(); 
    } 
    catch (IOException e) 
    { 
    System.out.println("IO-Error open/close of file" + filename); 
    } 
} 
+0

你爲什麼不把整個東西看成一個字符串。將字符串拆分爲「,」,然後將其轉換爲二維數組? –

+0

在您的catch語句中,而不是僅打印出「Error conversions number」,使用e.printStackTrace()。或者System.out.println(e)。這樣你可以真正看到錯誤是什麼。 –

+0

你的問題解決了嗎? – gowtham

回答

0

以下一段代碼片段可能會有幫助。基本思想是讀取每行並解析出CSV。請注意,CSV解析通常很困難,大多數情況下需要專門的庫(如CSVReader)。但是,手頭的問題相對比較簡單。

try { 
    String line = ""; 
    int rowNumber = 0; 
    while(scan.hasNextLine()) { 
     line = scan.nextLine(); 
     String[] elements = line.split(','); 
     int elementCount = 0; 
     for(String element : elements) { 
      int elementValue = Integer.parseInt(element); 
      spaces[rowNumber][elementCount] = elementValue; 
      elementCount++; 
     } 
     rowNumber++; 
    } 
} // you know what goes afterwards 
0

由於它是逐行讀取的文件,因此使用分隔符「,」讀取每行。

所以,在這裏,你只需要創建通過使用delimter每行一個新的掃描對象「」

代碼看起來像這樣,在第一個for循環

  for(int i = 0; i < 10; i++) 
       { 
        Scanner newScan=new Scanner(scan.nextLine()).useDelimiter(","); 
        counter = counter + 1; 
        for(int m = 0; m < 10; m++) 
        { 
         Spaces[i][m] = newScan.nextInt(); 
        } 
       } 
0

爲什麼要使用掃描儀的文件?您已有BufferedReader

FileReader fileReader = new FileReader(filename); 
BufferedReader reader = new BufferedReader(fileReader); 

現在您可以逐行讀取文件。棘手位是你想要的int

int[][] spaces = new int[10][10]; 
String line = null; 
int row = 0; 
while ((line = reader.readLine()) != null) 
{ 
    String[] array = line.split(","); 
    for (int i = 0; i < array.length; i++) 
    { 
     spaces[row][i] = Integer.parseInt(array[i]); 
    } 
    row++; 
} 

另一種方法是使用單獨的線Scanner數組:

while ((line = reader.readLine()) != null) 
{ 
    Scanner s = new Scanner(line).useDelimiter(','); 
    int col = 0; 
    while (s.hasNextInt()) 
    { 
     spaces[row][col] = s.nextInt(); 
     col++; 
    } 
    row++; 
} 

值得一提的另一件事是,你使用的是int[10][10];這要求您事先知道文件的長度。 A List<int[]>將刪除此要求。

+0

非常感謝您的快速回復。緩衝的閱讀器代碼片段完美工作,更有意義。我唯一會遇到的其他問題是「使用緩衝讀寫器vs掃描儀有什麼好處?」 – user3226338

0

使用Scanner中的useDelimiter方法將分隔符設置爲「,」而不是默認空格字符。 根據給出的示例輸入,如果二維數組中的下一行開始於新行,而不是使用「,」,則必須指定多個分隔符。

實施例:

scan.useDelimiter(",|\\r\\n"); 

這設置分隔符兩者 「」 和回車+新行字符。

0

我在這裏提供我的代碼。

public static int[][] readArray(String path) throws IOException { 
    //1,0,1,1,0,1,0,1,0,1 
    int[][] result = new int[3][10]; 
    BufferedReader reader = new BufferedReader(new FileReader(path)); 
    String line = null; 
    Scanner scanner = null; 
    line = reader.readLine(); 
    if(line == null) { 
     return result; 
    } 
    String pattern = createPattern(line); 
    int lineNumber = 0; 
    MatchResult temp = null; 
    while(line != null) { 
     scanner = new Scanner(line); 
     scanner.findInLine(pattern); 
     temp = scanner.match(); 
     int count = temp.groupCount(); 
     for(int i=1;i<=count;i++) { 
      result[lineNumber][i-1] = Integer.parseInt(temp.group(i)); 
     } 
     lineNumber++; 
     scanner.close(); 
     line = reader.readLine(); 
    } 
    return result; 
} 

public static String createPattern(String line) { 
    char[] chars = line.toCharArray(); 
    StringBuilder pattern = new StringBuilder();; 
    for(char c : chars) { 
     if(',' == c) { 
      pattern.append(','); 
     } else { 
      pattern.append("(\\d+)"); 
     } 
    } 
    return pattern.toString(); 
} 
相關問題