【发布时间】: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 非常陌生。