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

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

csv文件如下所示


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

  1. int n = 100; // Max lines
  2. String line;
  3. try (BufferedReader br = new BufferedReader(new FileReader(str)))
  4. {
  5. while ((line = br.readLine()) != null && i++ < n)
  6. {
  7. br.readLine();
  8. line = br.readLine();
  9. System.out.println(line);
  10. }
  11. }

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

yws3nbqq

yws3nbqq1#

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

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

sr4lhrrt2#

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

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

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

  1. public static void main(String[] args) throws IOException, URISyntaxException {
  2. Path filePathFromProjectFolder = Path.of(ClassLoader.getSystemResource("file.csv").toURI());
  3. Map<String, String> csvValues = Files.readAllLines(filePathFromProjectFolder).stream()
  4. .map(line -> line.split(" "))
  5. .collect(Collectors.toMap(line -> getKeyName(line[0]), line -> line[1]));
  6. System.out.println(csvValues);
  7. }
  8. private static String getKeyName(String str) {
  9. return str.split("\\$\\$")[1];
  10. }
展开查看全部
qvtsj1bj

qvtsj1bj3#

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

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

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

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

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

  1. Function<String, String> keyMapper = line -> {
  2. String[] parts = line.split(" ");
  3. return parts[0].substring(2, parts[0].length() - 2);
  4. };
  5. Function<String, String> valueMapper = line -> {
  6. String[] parts = line.split(" ");
  7. if (parts.length > 1) {
  8. return parts[1];
  9. }
  10. else {
  11. return "";
  12. }
  13. };
  14. Path path = Paths.get(str);
  15. try {
  16. Map<String, String> map = Files.lines(path)
  17. .limit(100)
  18. .filter(line -> line.matches("\\$\\$[A-Z]+\\$\\$ [0-9A-Z]*$"))
  19. .collect(Collectors.toMap(keyMapper, valueMapper));
  20. System.out.println(map);
  21. }
  22. catch (IOException xIo) {
  23. xIo.printStackTrace();
  24. }

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

展开查看全部

相关问题