【问题标题】:Parse TSV(text) files and get values from a column解析 TSV(文本)文件并从列中获取值
【发布时间】:2016-05-05 00:59:00
【问题描述】:

我试图解析并获取一些信息的文件夹中有一堆 TSV 文件。每个文件都有不同的列(具有不同的标题),但其中一列在所有文件中绝对是通用的。我有一个我感兴趣的标题列表,在一个文本文件中。我正在解析该文件并尝试使用 uniVocity 解析工具来获取这些特定列的信息。当我尝试使用一个或两个标头时它起作用了,但是当文件中的所有标头都通过时,它什么也不返回。

这是我的代码:

import com.univocity.parsers.tsv.TsvParser;
import com.univocity.parsers.tsv.TsvParserSettings;

import java.io.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import static com.univocity.parsers.conversions.Conversions.toLowerCase;


public class getdata {
    public static void main(String argv[]) throws IOException {

        String filename = "tmp_collist.txt";

        BufferedReader reader = new BufferedReader(new FileReader(filename));
        Set<String> lines = new HashSet<String>(10000);
        String line;
        while ((line = reader.readLine()) != null) {
            lines.add(line);
        }
        String str = lines.toString().replaceFirst("\\[", "");
        StringBuilder _sb = new StringBuilder(str);
        //str = '"' + _sb;
        str = _sb.insert(0, '"').toString();
        if (str != null && str.length() > 0 && str.charAt(str.length() - 1) == ']') {
            str = str.substring(0, str.length() - 1);
        }
        str += '"';
        str = str.replace(", ", "\",\"");
        //System.out.print(str);
        //reader.close();
        File folder = new File("folder_location");
        File[] listOfFiles = folder.listFiles();
        for (int i = 0; i < listOfFiles.length; i++) {
            File file1 = listOfFiles[i];
            if (file1.isFile() && file1.getName().endsWith(".txt")) {
                TsvParserSettings settings = new TsvParserSettings();
                settings.getFormat().setLineSeparator("\n");
                settings.selectFields(str);
                TsvParser parser = new TsvParser(settings);
                List<String[]> resolvedData = parser.parseAll(new FileReader(file1));
                for (String[] row : resolvedData) {
                    StringBuilder strBuilder = new StringBuilder();
                    for (String col : row) {
                        strBuilder.append(col).append("\t");
                    }
                }
            }
        }
    }
}

TSV 文件如下:

sample_file1.txt

header1 header2 header3
val11   val21   val31
val12   val22   val32

sample_file2.txt

header1 header5 header3
val11   val51   val35
val14   val54   val38

tmp_collist.txt 有我需要的标题列表。它是一个包含一列的文件:

header2
header3
header9
header8

我想获取所有 header1 值的列表(如果可能,唯一的),对于提供的标题中的每个值(它可以在文件或任何东西中)。

【问题讨论】:

  • 所以这听起来像是基于公共列 (header1) 的表(文件)之间的连接。这是否总结了您的需求?
  • @YoYo 是的。这就是我需要的。
  • 在我看来,将数据加载到数据库中并使用 SQL 来完成此操作更方便,或者使用在任意数据集上提供类似 SQL 的操作的 api。这甚至是一种选择吗?
  • @YoYo 类似 SQL 的操作听起来是个好主意。如果您能指导我完成它,我将不胜感激。我对 Java 非常陌生。

标签: java parsing csv


【解决方案1】:

我是该库的作者,刚刚发现当标头名称不匹配时字段选择存在问题(请参阅here)。

尝试获取最新版本(2.1.1-SNAPSHOT),当您选择输入文件中不存在的标头时,您将获得预期的结果。

希望这会有所帮助。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
相关资源
最近更新 更多