Java 将文本从文件存储到数组
我有一个文本文件,看起来像这样Java 将文本从文件存储到数组,java,arrays,file,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
{{"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"
任何算法、植入、建议都将被应用您可以使用
replaceAll
和split
这样做:
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));
}
如果使用列表
,则它看起来更像:
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);
}
}
publicstaticvoidmain(字符串[]args)引发异常{
最后一个字符串输入=“{\'12\',\'13\',\'2\',\'5\',{\'14\',\'14\',\'1\',\'4\',{\'36\',\'30\',\'1\',\'9\'}”;
最后一个字符串[]rows=input.replaceAll(“^\\{\\{}}$”,“”)。split(“},\\{”);
转换后的最终列表=新的ArrayList();
用于(最后一行字符串:行){
最后一个字符串[]列=row.replaceAll(“^\”|\“$”,”).split(“\”,\”);
最终列表transformedRow=新的ArrayList();
for(最终字符串数据:列){
transformedRow.add(数据);
}
transformed.add(transformedRow);
}
}
索引中的循环数越少,代码就越清晰,但真正痛苦的是
字符串的处理,因此您不会获得太多的收益。我假设每一行只能包含一行
- <代码>{{a、、b、c}、
{“a”、“b”、“c”},
{“a”、“b”、“c”}
{
或{
开头,以}、
或}、
结尾
你需要做的是
{
和}
以及开头和结尾处的引号,这样您将只得到a”、“b”、“c
,“
上拆分结果以获取数组[a、b、c]
如果您使用的是Java8,那么也可以使用streams
List<String[]> rows = Files.lines(Paths.get("input.txt"))
.map(s -> s.replaceAll("[\\s{]\\{\"|\"\\}[,}]", ""))
.map(s-> s.split("\",\""))
.collect(Collectors.toList());
List rows=Files.line(path.get(“input.txt”))
.map(s->s.replaceAll(“[\\s{]\\{\”\\\\“\\\}[,}],”)
.map(s->s.split(“\”,\”)
.collect(Collectors.toList());
函数breakIntoArray=(字符串s)->{
s=s.replaceAll(“}”和“);
s=s.replaceAll(“\\{,”);
s=s.replaceAll(“\”,“);
返回s.split(“,”);
};
Path tradePath=Path.get(“xxx.txt”);
Files.lines(tradePath).map(breakIntoArray.collect(Collectors.toList());
看起来像JSON数据,是吗?是的,它是JSON的一种,但它是我从另一个软件获得的输出,现在我想将它们存储在数组中以供进一步使用processing@BoristheSpider这不是有效的json。对于正确的json,必须用方括号替换卷曲括号,因为值没有关联的键。是的,它不是json格式t问题是如何提取值,因为没有统一的花括号来使用拆分方法或分隔符。您的文件总是在一行中有一行吗?您知道文件中将有多少行吗?您可以使用集合(列表)而不是数组吗?
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]
List<String[]> rows = Files.lines(Paths.get("input.txt"))
.map(s -> s.replaceAll("[\\s{]\\{\"|\"\\}[,}]", ""))
.map(s-> s.split("\",\""))
.collect(Collectors.toList());
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());