对于大量数据,每一列代表一个不同的变量。我正在尝试提取每个数字,并将其放入每行的数组中。
下划线表示空格
2___2___2_______3___1___19
1___3___2_______3___3___19
1___3___4_______3___1___19
6___3___6_______5_______13
5___2___5_______5_______13
5___4___4___7___4_______13
spaceForNew表示在找到下一个变量之前还剩下多少个字符。这与当前变量不同。
我使用了以下代码:
public static int[] remaining(String Line)throws IOException
{
int[] data = new int[7];
int pointer = 0;
int spaceForNew = 0;
for(int i = 0;i<=Line.length()-1;i++)
{
if(i<Line.length()-1)
{
if((i == spaceForNew)&&(pointer<6))
{
//two digit
if((Line.charAt(i)=='1')&&(Line.charAt(i+1)=='0'))
{
data[pointer] = 10;
spaceForNew+=3;
pointer++;
//one digit
}else if((Line.charAt(i)!= ' ')&&(Line.charAt(i+1)!='0')){
data[pointer] = Integer.parseInt(Character.toString(Line.charAt(i)));
spaceForNew+=2;
pointer++;
}else if((Line.charAt(i)==' ')&&(data[pointer]==0)){
data[pointer]=-1;
spaceForNew++;
pointer++;
}
}
}else {
if(pointer==6)
{
data[pointer]=Integer.parseInt(Character.toString(Line.charAt(i)));
}
}
}
return data;
}
下面的代码很可怕,也不是很直观,但似乎对许多数据有效,但以一种几乎是随机的方式失败了。如有任何建议,我们将不胜感激。
发布于 2019-06-06 06:11:58
您可以使用正则表达式来解析行(\d+| )(?: )?
这基本上是说给我所有的数字或一个空格,后面跟着或不跟3个空格。您将获得一个字符串列表,这些字符串既可以解析为数字,也可以是一个空格,您可以将其作为缺少的数据来处理,但它将是一个占位符,因此您可以保持列的整齐。
Integer[] parsed = new Integer[7];
String thing = "2 2 2 3 1 19";
Pattern pattern = Pattern.compile("(\\d+| )(?: )?");
Matcher m = pattern.matcher(thing);
int index = 0;
while (m.find()) {
if (!" ".equals(m.group(1)))
parsed[index] = Integer.parseInt(m.group(1));
else
parsed[index] = -1; //or what ever your missing data value should be.
index++;
}
Arrays.asList(parsed).forEach(System.out::println);
编辑*超级修复。group(0)是整个模式,然后是任何捕获组。因此group(1)获取第一个捕获组,它只是数字或单个空格。
发布于 2019-06-06 06:54:01
您需要知道每行的确切模式是什么。我假设每个“列”都有一个固定的宽度,否则,数字不会像这样对齐。
例如,假设每列的宽度为3个字符(数字和/或空格),而列分隔符的宽度为1个空间,则您的模式可能如下所示:
[ \d]{3} |[ \d]{1,3}
现在,使用Pattern::compile
、Pattern::matcher
和Matcher::find
,您可以搜索当前行中的所有数字。假设lines
是一个List<String>
,每个元素都是一行:
// Precompile pattern. This matches either a cell followed by a space, or,
// if we are at the end of the line, a variable number of spaces and/or
// digits.
Pattern pattern = Pattern.compile("[ \\d]{3} |[ \\d]{1,3}");
List<List<Integer>> matrix = lines.stream()
.map(pattern::matcher)
.map(matcher -> {
List<Integer> ints = new ArrayList<>();
while (matcher.find()) {
String element = matcher.group().trim();
ints.add(!element.isEmpty() ? Integer.valueOf(element) : -1);
}
return ints;
})
.collect(Collectors.toList());
使用dimo414提供的MatcherStream
Pattern pattern = Pattern.compile("[ \\d]{3} |[ \\d]{1,3}");
List<List<Integer>> matrix = lines.stream()
.map(line -> MatcherStream.find(pattern, line)
.map(String::trim)
.map(element -> !element.isEmpty() ? Integer.valueOf(element) : -1)
.collect(Collectors.toList()))
.collect(Collectors.toList());
https://stackoverflow.com/questions/56468331
复制相似问题