java—如何使用bufferedreader捕获csv文件中的字段值

yb3bgrhw  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(435)

csv文件如下所示


我试图得到像name这样的字段值,它是$$name$$后面的值(标识符后面有一个空格)。如何在java中使用bufferedreader存储每个字段的值?字段可以是任何行号,而不是固定的位置或格式,如果遇到任何特殊字符或空值,也会抛出错误。

int n = 100; // Max lines
              String line;
              try (BufferedReader br = new BufferedReader(new FileReader(str)))
               {
                   while ((line = br.readLine()) != null && i++ < n)
                {
                      br.readLine();
                  line = br.readLine();
                  System.out.println(line);
                 }
               }

一旦从csv文件中提取了这些值,我就需要将它们存储在一个字符串变量中,然后使用它将每个列的值插入到数据库中
案例2:对于最后一个字段$$group$$category,在单元格9到11中的值是“5”,我需要匹配数据库中的列类别必须是5,存储在字符串中,才能插入到同名的数据库列中。当我使用line.matches条件时,正则表达式找不到完全匹配

yws3nbqq

yws3nbqq1#

您可以在此处使用regex来检测名称行:

int n = 100; // Max lines
String line;
try (BufferedReader br = new BufferedReader(new FileReader(str))) {
    while ((line = br.readLine()) != null && i++ < n) {
        if (line.matches("\\$\\$NAME\\$\|$.$")) {
            System.out.println(line.split(" ")[1]);
        }
    }
}
sr4lhrrt

sr4lhrrt2#

我建议您首先按空格分割行,然后生成类似$$name$$,john的内容。然后取回美元符号之间的钥匙。
基于您的代码片段的示例:

int i = 0;
int n = 100; // Max lines
String line;
try (BufferedReader br = new BufferedReader(new FileReader(str))) {
  while ((line = br.readLine()) != null && i++ < n) {
    String[] splitLine = line.split(" ");
    String key = splitLine[0].split("\\$\\$")[1];
    String value = splitLine[1];
    System.out.printf("Name: %s | Value: %s%n", key, value);
  }
}

您还可以使用更现代的方法,使用java 9文件api和流,下面是一个示例:

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

    Path filePathFromProjectFolder = Path.of(ClassLoader.getSystemResource("file.csv").toURI());
    Map<String, String> csvValues = Files.readAllLines(filePathFromProjectFolder).stream()
        .map(line -> line.split(" "))
        .collect(Collectors.toMap(line -> getKeyName(line[0]), line -> line[1]));

    System.out.println(csvValues);
  }

  private static String getKeyName(String str) {
    return str.split("\\$\\$")[1];
  }
qvtsj1bj

qvtsj1bj3#

下面的代码将只读取文件的前100行,并将值提取到列表中。

java.nio.file.Path path = java.nio.file.Paths.get(str);
try {
    java.util.List<String> values = java.nio.file.Files.lines(path)
                                                       .limit(100)
                                                       .filter(line -> line.matches("\\$\\$[A-Z]+\\$\\$ [0-9A-Z]*$"))
                                                       .map(line -> {
                                                           String[] words = line.split(" ");
                                                           return words.length == 2 ? words[1] : "";
                                                       })
                                                       .collect(java.util.stream.Collectors.toList());
    System.out.println(values);
}
catch (java.io.IOException xIo) {
    xIo.printStackTrace();
}

根据问题中的示例文件,上面的代码将创建以下列表。

[JOHN, CA, SF, XYZ, , 25, CATEGORY, ]

如果你想要Map而不是Map List 在哪里 Map 键之间的值 $ 人物与角色 Map 值是空格后的部分,然后

Function<String, String> keyMapper = line -> {
    String[] parts = line.split(" ");
    return parts[0].substring(2, parts[0].length() - 2);
};
Function<String, String> valueMapper = line -> {
    String[] parts = line.split(" ");
    if (parts.length > 1) {
        return parts[1];
    }
    else {
        return "";
    }
};
Path path = Paths.get(str);
try {
    Map<String, String> map = Files.lines(path)
                                   .limit(100)
                                   .filter(line -> line.matches("\\$\\$[A-Z]+\\$\\$ [0-9A-Z]*$"))
                                   .collect(Collectors.toMap(keyMapper, valueMapper));
    System.out.println(map);
}
catch (IOException xIo) {
    xIo.printStackTrace();
}

这将创建以下内容 Map ```
{GROUP=CATEGORY, WEATHER=, CITY=SF, STATE=CA, TIME=, NAME=JOHN, REGION=XYZ, AGE=25}

相关问题