Java,从带有特殊符号的txt文件读取数字到二维整数数组

时间:2014-11-30 20:22:05

标签: java arrays java.util.scanner bufferedreader filereader

所以,从我开始尝试解释我想要完成的事情。我是java的新手,我愿意学习它。问题:

我们假设我的txt文件中填充了类似的内容:

模式是:| a b |,当a是ID而b是实际数字时。我已经读过java中的Scanner,FileReader和BufferedReader类,我试图用它们从文件中恢复整数并将它们保存到我的二维整数数组([2] [1000])。 [0] [0-999]将是ID&1 [0-999]将是实际数字。现在是我坚持的那一刻 - 我可以先读两个零,但后来我不知道如何跳过|符号。

我现在的代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class ShortSearching {
    public static void main(String[] args) {

        int[] tall = new int[100];
        int i = 0, k = 0;
        Tab tablica = new Tab();
        File textFile = new File("byteObs.txt");
        try (Scanner scanner = new Scanner(textFile)) {
            while (scanner.hasNextInt()) {
                k++;
                tall[i++] = scanner.nextInt();
                System.out.println(tall[i]);
                if (k == 2) {
                    scanner.findInLine("|");
                    scanner.skip("|");
                    k = 0;
                }
            }

        } catch (FileNotFoundException e) {
            System.out.println("File not found: " + textFile.toString());
            //e.printStackTrace();
        }



        /*String byteObs = "byteObs.txt";
        File textFile = new File(byteObs);
        Scanner input = new Scanner(textFile);
        //short[] tabID,tabVal = new short[1000];
        byte k = 0;

        while (input.hasNextLine()) {


            for (int i = 0; i <= 999; i++) {
                for (int j = 0; j <= 999; j++) {
                    if (k != 2) {
                        if (input.hasNextShort()) {
                            //matrix[i][j] = input.nextShort();
                            //System.out.printf("%d ", matrix[i][j]);
                            k++;
                        }
                    }
                    else {
                        input.skip("|");
                        k=0;
                    }
                }
            }


        }
        input.close(); */
    }}

我尝试了多种方法,无法粘贴其中一些,因为它们已被删除。如果有人至少指出我应该阅读的关于能够跳过这个|的方法,我将不胜感激我文本文件中的符号。

PS。我知道for循环数字是错误的,当我修复跳过符号的东西时,我会改变它们。

EDIT http://wklej.org/id/1543739/

全文。

1 个答案:

答案 0 :(得分:2)

扫描程序的许多方法都希望模式代表正则表达式(正则表达式)。在skip方法的情况下也会发生这种情况,但在正则表达式中|是表示OR运算符的元字符。要使它变得简单,你需要在它之前添加\来逃避它(请记住,要在String中创建\文字,你还需要用另一个\来转义它。

因此代表|字符的正则表达式为\|,需要将其写为字符串"\\|"

其他问题是skip需要正则表达式,需要匹配需要跳过的整个部分,这部分必须完全出现在扫描仪光标的位置之后,所以在数据类似

的情况下
1 |

我们将调用nextInt()光标将在1之后设置(我将用I标记)

1I |

我们要跳过的模式是space + |

最后一个问题是你的文件在所有行中没有正确的值(它的行只包含
| |我们将无法使用nextInt(),因为下一个元素不会是int。在这种情况下,我们可以通过使用hasNextInt()简单地测试此行是否以整数开头,如果它不读取则不通过调用nextLine()来处理其内容。

所以你的代码看起来像

File textFile = new File("input.txt");
try (Scanner sc = new Scanner(textFile)) {
    while (sc.hasNextLine()) {
        if (sc.hasNextInt()) {
            System.out.println("id    = " + sc.nextInt());
            System.out.println("value = " + sc.nextInt());
            if (sc.hasNext("\\|"))
                sc.skip(" \\|");
        } else {
            sc.nextLine(); // skip line if it doens't contain more integers
        }
    }
} catch (FileNotFoundException e) {
    System.out.println("File not found: " + textFile);
}