Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用bufferedreader捕获csv文件中的字段值_Java_Regex_String_Csv_Talend - Fatal编程技术网

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

Java 如何使用bufferedreader捕获csv文件中的字段值,java,regex,string,csv,talend,Java,Regex,String,Csv,Talend,csv文件如下所示 我试图获得像name这样的字段值,它是$$name$$之后的值(标识符后面有一个空格)。如何在Java中使用BufferedReader存储每个字段的值?字段可以是任何行号,而不是固定的位置或格式,如果遇到任何特殊字符或空值,也会抛出错误 int n = 100; // Max lines String line; try (BufferedReader br = new BufferedReader(ne

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);
                 }
               }
int n=100;//最大线
弦线;
try(BufferedReader br=new BufferedReader(new FileReader(str)))
{
而((line=br.readLine())!=null&&i++
一旦从CSV文件中提取了值,我需要将它们存储在一个字符串变量中,然后使用它将每个列的值插入到数据库中

案例2:对于最后一个字段$$GROUP$$CATEGORY,单元格9到11中的值为“5”,我需要匹配数据库中的列类别必须以字符串形式存储为5,才能插入到同名的数据库列中。
当我使用line.matches条件时,正则表达式找不到精确的匹配项

您可以在此处使用正则表达式来检测名称行:

int n=100;//最大线
弦线;
try(BufferedReader br=new BufferedReader(new FileReader(str))){
而((line=br.readLine())!=null&&i++
我建议您首先将行按空格拆分,然后您将得到如下结果 $$NAME$$,约翰。然后在美元符号之间取回钥匙

基于您的代码片段的示例:

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);
  }
}
inti=0;
int n=100;//最大线
弦线;
try(BufferedReader br=new BufferedReader(new FileReader(str))){
而((line=br.readLine())!=null&&i++
您还可以使用更现代的方法,使用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];
  }
publicstaticvoidmain(字符串[]args)抛出IOException、URISyntaxException{
Path filePathFromProjectFolder=Path.of(ClassLoader.getSystemResource(“file.csv”).toURI());
Map csvValues=Files.readAllLines(filePathFromProjectFolder).stream()
.map(直线->直线分割(“”)
.collect(Collectors.toMap(行->getKeyName(行[0]),行->行[1]);
System.out.println(CSV值);
}
私有静态字符串getKeyName(字符串str){
返回str.split(“\\$\\$”)[1];
}

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

java.nio.file.Path Path=java.nio.file.Path.get(str);
试一试{
java.util.List values=java.nio.file.Files.lines(路径)
.限额(100)
.filter(line->line.matches(“\\$\\$[A-Z]+\\$\\$\$[0-9A-Z]*$”)
.map(行->{
String[]words=line.split(“”);
返回words.length==2?单词[1]:“”;
})
.collect(java.util.stream.Collectors.toList());
System.out.println(值);
}
捕获(java.io.ioxio){
xIo.printStackTrace();
}
根据您问题中的示例文件,上面的代码将创建以下列表

[JOHN,CA,SF,XYZ,25岁,类别,]
如果您想要一个而不是
列表
,其中
映射
键是双
$
字符之间的值,
映射
值是空格后的部分,则

函数键映射器=行->{
String[]parts=line.split(“”);
返回零件[0]。子字符串(2,零件[0]。长度()-2);
};
函数值映射器=行->{
String[]parts=line.split(“”);
如果(零件长度>1){
退货零件[1];
}
否则{
返回“”;
}
};
Path=Path.get(str);
试一试{
Map Map=文件.行(路径)
.限额(100)
.filter(line->line.matches(“\\$\\$[A-Z]+\\$\\$\$[0-9A-Z]*$”)
.collect(Collectors.toMap(keyMapper、valueMapper));
系统输出打印项次(map);
}
捕获(IOXIO异常){
xIo.printStackTrace();
}
这将创建以下
Map

{GROUP=CATEGORY,WEATHER=,CITY=SF,STATE=CA,TIME=,NAME=JOHN,REGION=XYZ,AGE=25}

为什么需要确定最大行数?字段是否重复,即
$$NAME$$
是否多次出现?每一行是否只包含您在示例中编写的内容,或者文件的每一行中是否有其他值?文件中的
$$WEATHER$$
后面是否还有空格?您希望如何存储字段值?您想将它们存储在一些数据结构中,如
ArrayList
,还是将它们写入另一个文件或插入数据库?这些字段不会重复,我提到最大行数只是因为我不想遍历csv中的所有行,因为我认为必填字段必须在前100行之前位于顶部。每行只有我提到的值,是的,$$WEATHER$$(空格)后面有一个空格,我更喜欢将提取的值存储在字符串中,作为列值插入到数据库表中。它不匹配,也不在if-lo中