在文本行中每次出现字符后获取价值

时间:2019-10-25 11:47:16

标签: java

我正在遍历java中文件的所有行并提取相关数据。我遇到问题的文件中只有一行。该行如下所示

"D|12345|TEST|This is a test|123|Test Data|"

我需要获取由|分隔的所有单个值。成单独的字符串,忽略“ D” 所以

String a = 1234 
String b = TEST

文件中有多行,但是我只关心以D开头的行,我将如何处理?我有一些示例代码,但是我对子字符串不好用

public class Main {

    public static void main(String[] args) throws IOException {

        try {

            File f = new File("src/main/resources/data.txt");

            List<String> lines = FileUtils.readLines(f, "UTF-8");

            for (String line : lines) {
                if (line.startsWith("D")) {
                    // this iis the line i am concerned about
                    // not sure how to get each value from the line
                    int ind = line.lastIndexOf("|") + 1;
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5 个答案:

答案 0 :(得分:2)

您可以使用方法String[]String直接获得split(...),请参见以下示例:

public static void main(String[] args) throws ParseException {
    String line = "D|12345|TEST|This is a test|123|Test Data|";

    String[] splitLine = line.split("\\|");

    for (String word : splitLine) {
        System.out.println(word);
    }
}

如果您想忽略第一列("D"),请采用经典的for循环并从索引1开始:

public static void main(String[] args) throws ParseException {
    String line = "D|12345|TEST|This is a test|123|Test Data|";

    String[] splitLine = line.split("\\|");

    for (int i = 1; i < splitLine.length; i++) {
        System.out.println(splitLine[i]);
    }
}

您基本上可以遍历文件的各行(就像您已经做过的那样),并且仅将行添加到List<String>(如果它为startsWith("D"),而忽略所有其他行)。然后,使用该List<String>,对其进行循环或流式处理,并按示例所示拆分每行。最好的方法是保存值以存储它们的类/ POJO。

答案 1 :(得分:1)

您要执行的操作是将行“拆分”为多个字符串:

line.split("\\|");

它将返回一个包含所有子字符串的数组:

String[] words = line.split("\\|");

因此,当您要忽略第一个“ D”时,可以忽略数组中的第一个条目(words[0] <-“ D”)

 D|12345|TEST|This is a test|123|Test Data|

 String[] words = line.split("\\|");

 words:
 ["D", "12345", "TEST", "This is a test", "123", "Test Data"];

编辑

正如deHaar所指出的,我忘记了特殊字符|,该字符将 line 分割为单个字符。因此,在您的情况下,您必须在转义符前面加上反斜杠来“转义” |。 (但是,由于反斜杠也为控制字符,因此您也必须对其进行转义),因此“ \\ |”

对于大多数其他(“正常”)字符,例如空白" ""a",则不需要这样做。

EDIT2

由于我在回答中犯了很多错误,所以让我向您展示一种消除的方法:

String words = line.substring(1).split("\\|");

附加的substring(1)将从第二个字符(索引为1的字符)开始返回“子字符串”-因此,所有在“ D”之后的字符都将返回。

答案 2 :(得分:1)

line.split("\\|");将为您提供字符串数组。然后忽略位置0处的元素。

答案 3 :(得分:0)

您可以使用

String[] splittedStr=line.split("\\|");

然后您可以遍历数组的每个项目。

答案 4 :(得分:0)

您必须分割字符串;然后迭代每个值,省略第一个元素。

对于循环版本:

String[] values = line.split("\\|");

for (int i = 1; i < values.length; i++) {
    System.out.println(values[i]);
}

流版本:

String[] values = line.split("\\|");

Stream.of(values)
    .skip(1)
    .forEach(System.out::println);