【问题标题】:Regex for CSV with more than commaCSV 的正则表达式不止逗号
【发布时间】:2016-03-17 10:28:07
【问题描述】:

我不是正则表达式专家,我正在寻找一个正则表达式,它会在同一行的连续逗号后返回值。

数据如下:

2016/02/19 04:25:56,User,0.9,0,0,0,0,0.0
2016/02/19 04:25:58,User,0.0,0,0,0,0,0.0
2016/02/19 04:25:58,User,0.0,0,0,0,0,0.0
2016/02/19 04:25:57,User,0.0,0,0,0,0,0.0

我只能在第一个命令(即日期和时间)之后将其分开。这是我正在使用的正则表达式:

\.*User.*( ? : \d * \.) ? \d +

【问题讨论】:

  • 您的问题需要更多信息来了解您的目标到底是什么。你想要的输出是什么?
  • 嗨,Seth,我需要获取每个逗号后面的值,以便使用另一个应用程序绘制图表
  • 为什么按, 拆分对您不起作用?还是我不明白你的问题?
  • 如果你使用java,你可以使用String[] arr = yourLine.split(',');数组的每个值将包含逗号之间的内容,例如:arr[1]将包含“用户”javadevnotes.com/java-string-split-tutorial-and-examples
  • 所以在我这一边@Kent 这很简单但很棘手,在 User 之后的每个逗号之后,每个人都是一个值。

标签: java regex csv


【解决方案1】:

如果您有固定数量的列,您可以使用以下正则表达式来满足您的需求。

   Pattern pattern = Pattern.compile("(\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}:\\d{2}),([^,]*),([\\d\\.]*),([\\d\\.]*),([\\d\\.]*),([\\d\\.]*),([\\d\\.]*),([\\d\\.]*)");
   Matcher matcher = pattern.matcher("2016/02/19 04:25:56,User,0.9,0,0,0,0,0.0");

   if(matcher.matches()){
       int groupCount = matcher.groupCount();
       for (int i = 0; i < groupCount; i++) {
           System.out.println(matcher.group(i));
       }
   }

【讨论】:

    【解决方案2】:

    就数据的存储方式而言,您的问题非常模糊,我假设这是数据当前是一个字符串或多个。为什么不将每个数据字符串附加到一个巨型字符串中,每个用户用分号分隔,用ArrayList&lt;String&gt; dataList = new ArrayList&lt;String&gt;(Arrays.asList(dataStr.split("\\;")) 将其拆分为一个列表,然后将该列表的内容拆分为各自的子列表,用冒号拆分? 例如:

    "user1:data1:data2;user2:data1:data2;user3:data1:data2;
    **split by semicolon**
    = [user1:data1:data2]
      [user2:data1:data2]
      [user3:data1:data2]
    **split again by colon**
    = [[user1][data1][data2]
      [[user2][data1][data2]
      [[user3][data1][data2]
    

    这样您可以通过索引引用用户,然后通过子索引引用他们包含的数据。在实践中,它看起来像:

    public static void main(String[] args){
    
        String dataStr = "2016/02/19 04:25:56,User,0.9,0,0,0,0,0.0\n"
                      +"2016/02/19 04:25:58,User,0.0,0,0,0,0,0.0\n"
                      +"2016/02/19 04:25:58,User,0.0,0,0,0,0,0.0\n"
                      +"2016/02/19 04:25:57,User,0.0,0,0,0,0,0.0\n";
    
        //ArrayList containing a line of split data
        ArrayList<String> dataList = new ArrayList<String>(Arrays.asList(dataStr.split("\\n")));
        //ArrayList of each ArrayList containing a line
        ArrayList<ArrayList<String>> listOfDataLists = new ArrayList<ArrayList<String>>();
    
    
        //To the end of 
        for(int i = 0; i < dataList.size(); i++)
        {
            listOfDataLists.add(new ArrayList<String>(Arrays.asList(dataList.get(i).split(","))));
        }
    
        //DEBUG PRINTS---------------------------------------------------------------------
        System.out.println("------------DEBUG-------------");
        for(int i = 0; i < listOfDataLists.size(); i++){
            for(int j = 0; j < listOfDataLists.get(i).size(); j++){
                System.out.println("[" + listOfDataLists.get(i).get(j) + "]");
            }
            System.out.println("------------------------------");
        }
    }
    

    在这里,为了便于阅读,我将数据字符串分成单独的行,然后使用换行正则表达式而不是我之前建议的分号,但本质上它只是同一件事。处理:

    2016/02/19 04:25:56,User,0.9,0,0,0,0,0.0;2016/02/19 04:25:58,User,0.0,0,0,0,0,0.0;2016/02/19 04:25:58,User etc....
    

    只需要替换分号的 split("\n") ,或者实际上你的偏好可能是什么。如果数据已经存储为用户列表(可能考虑到您已经将它们垂直列出),那么该死的,您已经完成了一半。

    当前状态下的输出是:

    ------------DEBUG-------------
    [2016/02/19 04:25:56]
    [User]
    [0.9]
    [0]
    [0]
    [0]
    [0]
    [0.0]
    ------------------------------
    [2016/02/19 04:25:58]
    [User]
    [0.0]
    [0]
    [0]
    [0]
    [0]
    [0.0]
    ------------------------------
    [2016/02/19 04:25:58]
    [User]
    [0.0]
    [0]
    [0]
    [0]
    [0]
    [0.0]
    ------------------------------
    [2016/02/19 04:25:57]
    [User]
    [0.0]
    [0]
    [0]
    [0]
    [0]
    [0.0]
    ------------------------------
    

    我希望这与您希望得到的答案相符,因为它将每个用户的数据保存在一个列表中,同时仍然保留分配给他们的用户数据,因为您可以通过父列表获取用户索引,然后他们的数据按子列表索引。

    免责声明:我不是绝地大师级程序员,这可行,但我不能保证这是最好的方式。然而,这确实是一种方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      相关资源
      最近更新 更多