java - Java 中的 TSV 解释器

标签 java regex csv

我正在创建一段 java 代码来读取和解释 tsv 文件。我想找到一个能够分割文件中的行的正则表达式:

  • 项目之间用制表符分隔
  • 字符串用引号括起来
  • 数字不加引号
  • 引号可以包含引号,引号将被引号转义(即双引号 "")
  • 字符串可以包含制表符

示例输入行:

"aaa"    123    "bbb"    "cc"    "ddd"
"aaa"    123    "bbb"    "cc"    "    6"
"ddd"    456    "eee"    "ff"    "       ""     "
"ddd"    456    "eee"    "ff"    "    "" aaa ""   "

* (请注意:最后三个字符串中的制表符)

我当前的正则表达式是 ("[^"]*"*|[^\t]+)+,但在最后一个示例中失败(使子字符串更小)

最佳答案

让我们解决这个问题:

\t(?=(?:\[^\"\]*\"\[^\"\]*\")*\[^\"\]*$)(点击链接获取模式描述)

示例代码:ideone demo

import java.util.regex.Pattern;
public class example {
  public static void main(String[] asd){
  String sourcestring = "\"aaa\"    123 \"bbb\" \"cc\"  \"ddd\"\n"
             + "\"aaa\" 123 \"bbb\" \"cc\"  \"  6\"\n"
             + "\"ddd\" 456 \"eee\" \"ff\"  \"          \"\"     \"\n"
             + "\"ddd\" 456 \"eee\" \"ff\"  \"  \"\" aaa \"\"   \"";
  Pattern reLines = Pattern.compile("\\n");          
  Pattern reTsv = Pattern.compile("\\t(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)");
  String[] lines = reLines.split(sourcestring);
  for(int linesIdx = 0; linesIdx < lines.length; linesIdx++ ) {
    String[] parts = reTsv.split(lines[linesIdx]);
    for(int partsIdx = 0; partsIdx < parts.length; partsIdx++ ) {
        System.out.println( "[" + partsIdx + "] = " + parts[partsIdx]);
      }
    }
  }
}

输出:

[0] = "aaa"
[1] = 123
[2] = "bbb"
[3] = "cc"
[4] = "ddd"
[0] = "aaa"
[1] = 123
[2] = "bbb"
[3] = "cc"
[4] = "  6"
[0] = "ddd"
[1] = 456
[2] = "eee"
[3] = "ff"
[4] = "         ""     "
[0] = "ddd"
[1] = 456
[2] = "eee"
[3] = "ff"
[4] = " "" aaa ""   "

关于java - Java 中的 TSV 解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49893668/

相关文章:

java - 使用Docker在本地设置微服务

javascript - JS 正则表达式匹配句子

c# - Regex.Replace 的模式无法正常工作

python - 写入 CSV 时编码 UTF-8

java - SwingUtilities.invokeLater() 与 EventQueue.invokeLater()

java - 整数除法转换为 double

java - 使用java查找selenium对象标签

javascript - 使用 javascript 正则表达式删除 <a> 标签内的嵌套标签?

Python - 读取 csv 并按列对数据进行分组

python - 更多 < 子进程调用 Python 中的运算符