将文本从文件存储到数组

时间:2014-07-13 10:42:27

标签: java arrays file

我有一个看起来像这样的文本文件

{{"12","13","2","5"},
 {"14","14","1","4"},
 {"36","30","1","9"}}

我希望将其存储在数组中 来自上述相同文件的数组大小为3x4 其中文件的每一行有4个字符串,并且有3个这样的行 所以数组应该看起来像

array[0][1]="12"
array[0][2]="13"
array[0][3]="2"
array[0][4]="5"
array[1][1]="14"
array[1][2]="14"
array[1][3]="1"
array[1][4]="4"
array[2][1]="36"
array[2][2]="30"
array[2][3]="1"
array[2][4]="9"

任何算法,植入,建议都将适用

3 个答案:

答案 0 :(得分:0)

您可以使用replaceAllsplit轻松完成此操作:

public static void main(String[] args) throws Exception {
    final String input = "{{\"12\",\"13\",\"2\",\"5\"},{\"14\",\"14\",\"1\",\"4\"},{\"36\",\"30\",\"1\",\"9\"}}";
    final String[] rows = input.replaceAll("^\\{\\{|}}$", "").split("},\\{");
    final String[][] transformed = new String[rows.length][];
    for (int i = 0; i < rows.length; ++i) {
        final String[] columns = rows[i].replaceAll("^\"|\"$", "").split("\",\"");
        transformed[i] = new String[columns.length];
        System.arraycopy(columns, 0, transformed[i], 0, columns.length);
    }
    System.out.println(Arrays.deepToString(transformed));
}

输出:

[[12, 13, 2, 5], [14, 14, 1, 4], [36, 30, 1, 9]]

如果你使用List<List<String>>,那么它看起来更像是:

public static void main(String[] args) throws Exception {
    final String input = "{{\"12\",\"13\",\"2\",\"5\"},{\"14\",\"14\",\"1\",\"4\"},{\"36\",\"30\",\"1\",\"9\"}}";
    final String[] rows = input.replaceAll("^\\{\\{|}}$", "").split("},\\{");
    final List<List<String>> transformed = new ArrayList<>();
    for (final String row : rows) {
        final String[] columns = row.replaceAll("^\"|\"$", "").split("\",\"");
        final List<String> transformedRow = new ArrayList<>();
        for (final String data : columns) {
            transformedRow.add(data);
        }
        transformed.add(transformedRow);
    }
}

通过索引减少循环使代码更清晰,但实际上String处理是痛苦的部分,因此你没有获得太多。

答案 1 :(得分:0)

我将假设每一行只能包含一个表格中的一行

  • {{"a","b","c"},
  • {"a","b","c"},
  • {"a","b","c"}}

换句话说,每一行都可以以{{ {开头,以},},结尾。

您需要做的是

  1. 逐行阅读文件,
  2. 删除所有{}以及开头和结尾的引号,以便您只获得a","b","c
  3. 将结果拆分为","以获取数组[a,b,c]
  4. 将该数组放在结果数组中
  5. 您的代码可能看起来像(而不是包含文件数据的String,您可以使用代表文件位置的File):

    int rows = 3;
    String[][] result = new String[rows][];
    
    String data = "{{\"12\",\"13\",\"2\",\"5\"},\r\n"
            + " {\"14\",\"14\",\"1\",\"4\"},\r\n"
            + " {\"36\",\"30\",\"1\",\"9\"}}";
    Scanner sc = new Scanner(data);
    
    for (int i=0; i<rows; i++){
        String line = sc.nextLine();
        line = line.replaceAll("[\\s{]\\{\"|\"\\}[,}]", "");
        result[i]=line.split("\",\"");
    }
    sc.close();
    
    for (String[] arr : result)
        System.out.println(Arrays.toString(arr));
    

    输出:

    [12, 13, 2, 5]
    [14, 14, 1, 4]
    [36, 30, 1, 9]
    

    如果您使用的是Java 8,还可以使用流

    List<String[]> rows = Files.lines(Paths.get("input.txt"))
        .map(s -> s.replaceAll("[\\s{]\\{\"|\"\\}[,}]", ""))
        .map(s-> s.split("\",\""))
        .collect(Collectors.toList());
    

答案 2 :(得分:0)

    Function<String, String[]> breakIntoArray = (String s)->{
        s = s.replaceAll("}", "");
        s = s.replaceAll("\\{", "");
        s = s.replaceAll("\"", "");
        return s.split(",");
    };

    Path tradePath = Paths.get("xxx.txt");
    Files.lines(tradePath).map(breakIntoArray).collect(Collectors.toList());