解析TSV(文本)文件并从列中获取值

时间:2016-05-05 00:59:00

标签: java parsing csv

我在一个文件夹中有一堆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值的列表(如果可能,唯一),为所提供的标头中的每个值(它可以在文件或任何内容中)。

1 个答案:

答案 0 :(得分:1)

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

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

希望这有帮助。