2014-01-23 161 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(); 
} 
相关问题