java - 使用 | 分割 csv 文件分隔符

标签 java apache-beam

我有一个 csv 文件,其中一列的格式为:

enter image description here

我想处理这个文件,结果应该是:

enter image description here

第四列应使用“|”分隔分隔符。

我是java新手,所以有人可以帮我设计它背后的逻辑吗?

编辑:我尝试过如下所示:

PCollection<String> event1 = p.apply(TextIO.read().from("gs://bucket/input/Event_Setup.csv"));
     PCollection<ClassEvent1> pojos1 = event1.apply(ParDo.of(new DoFn<String, ClassEvent1>() { // converting String into class              
        private static final long serialVersionUID = 1L;
        @ProcessElement
        public void processElement(ProcessContext c) {          
            String[] strArr = c.element().split(",");
            int strArrlen = strArr.length;
            String[] strsplit = null;
            for (int i = 0 ;i < strArrlen ;i++)
            {
                strsplit =  strArr[i].split("|");
            }

            ClassEvent1 clr = new ClassEvent1();
            clr.setEvntType(strArr[0]);
            clr.setEvntKey(strArr[1]);
            clr.setEvntName(strArr[2]);
            clr.setEvntComponents(strsplit[3]);
            clr.setCustEvntStrt(strArr[4]);
            clr.setCustEvntEnd(strArr[5]);
            clr.setNotes(strArr[6]);
            c.output(clr);
        }
    }));

最佳答案

    @ProcessElement
    public void processElement(ProcessContext c) { 
      // assuming "c.element()" is a line in your CSV         
      String[] strArr = c.element().split(",");  // this contains your CSV columns
      int strArrlen = strArr.length;  // this is the number of columns

      // no need to iterate over each column you are concerned with column 3
      /** 
      * for (int i = 0 ;i < strArrlen ;i++)
      * {
      *   strsplit = strArr[i].split("|");
      * }
      */
      // get the values of the 4 column (events)
      String[] strsplit = strArr[3].split("\\|"); // 3 not 4 because is zero based

      if (strsplit.length == 0) {  // there are no events
         ClassEvent1 clr = new ClassEvent1();
         clr.setEvntType(strArr[0]);
         clr.setEvntKey(strArr[1]);
         clr.setEvntName(strArr[2]);
         clr.setEvntComponents(strArr[3]); // no events just put original value
         clr.setCustEvntStrt(strArr[4]);
         clr.setCustEvntEnd(strArr[5]);
         clr.setNotes(strArr[6]);
         c.output(clr);
      } else {

        // create class event for each event in column 3
        for (int i=0; i < strsplit.length; i++) {
          ClassEvent1 clr = new ClassEvent1();
          clr.setEvntType(strArr[0]);
          clr.setEvntKey(strArr[1]);
          clr.setEvntName(strArr[2]);
          clr.setEvntComponents(strsplit[i]); // increment for each event
          clr.setCustEvntStrt(strArr[4]);
          clr.setCustEvntEnd(strArr[5]);
          clr.setNotes(strArr[6]);
          c.output(clr);
        }
    }
}

关于java - 使用 | 分割 csv 文件分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49884638/

相关文章:

java - 为 Dataflow v2.1 编写自定义无界接收器

java - 跨表单验证问题 Tapestry

java - Java 如何从 HashMap 中获取对象

java - 覆盖分区表Bigquery的一些分区

go - "No filesystem found for scheme gs"在谷歌云平台运行数据流时

java - 使用架构自动检测写入 BigQuery 的数据流作业

redis - 使用 apache beam sdk 时无法连接到 Redis 服务器

java - 如何扩展 JTree 节点(提前),但保持它们不可见

java - Android:如何将位图图像传递到 ArrayList<Bitmap> 并检索它

java - 如何从不同的android应用程序传递serializedExtra?