首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从给定的.txt文件中提取整数

从给定的.txt文件中提取整数
EN

Stack Overflow用户
提问于 2019-06-06 05:34:58
回答 2查看 84关注 0票数 1

对于大量数据,每一列代表一个不同的变量。我正在尝试提取每个数字,并将其放入每行的数组中。

下划线表示空格

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表示在找到下一个变量之前还剩下多少个字符。这与当前变量不同。

我使用了以下代码:

代码语言:javascript
复制
    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;
}

下面的代码很可怕,也不是很直观,但似乎对许多数据有效,但以一种几乎是随机的方式失败了。如有任何建议,我们将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2019-06-06 06:11:58

您可以使用正则表达式来解析行(\d+| )(?: )?

这基本上是说给我所有的数字或一个空格,后面跟着或不跟3个空格。您将获得一个字符串列表,这些字符串既可以解析为数字,也可以是一个空格,您可以将其作为缺少的数据来处理,但它将是一个占位符,因此您可以保持列的整齐。

代码语言:javascript
复制
    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)获取第一个捕获组,它只是数字或单个空格。

票数 0
EN

Stack Overflow用户

发布于 2019-06-06 06:54:01

您需要知道每行的确切模式是什么。我假设每个“列”都有一个固定的宽度,否则,数字不会像这样对齐。

例如,假设每列的宽度为3个字符(数字和/或空格),而列分隔符的宽度为1个空间,则您的模式可能如下所示:

代码语言:javascript
复制
[ \d]{3} |[ \d]{1,3}

现在,使用Pattern::compilePattern::matcherMatcher::find,您可以搜索当前行中的所有数字。假设lines是一个List<String>,每个元素都是一行:

代码语言:javascript
复制
// 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

代码语言:javascript
复制
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());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56468331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档