2016-05-05 11 views
1

Ich habe eine Reihe von TSV-Dateien in einem Ordner, den ich versuche zu analysieren und einige Informationen zu erhalten. Jede Datei hat verschiedene Spalten (mit unterschiedlichen Headern), aber eine der Spalten ist in allen Dateien eindeutig. Ich habe eine Liste von Kopfzeilen, die mich interessieren, in einer Textdatei. Ich analysiere diese Datei und versuche, das uniVocity-Parsing-Tool zu verwenden, um die Informationen dieser bestimmten Spalten zu erhalten. Es funktionierte, als ich mit einem oder zwei Headern versuchte, aber nichts zurückgibt, wenn alle Überschriften in der Datei übergeben werden.Parse TSV (Text) -Dateien und Werte aus einer Spalte

Hier ist mein Code:

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"); 
        } 
       } 
      } 
     } 
    } 
} 

und die TSV-Dateien sind wie:

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 hat Kopfzeilenliste t Was ich brauche. Es ist eine Datei mit einer Spalte:

header2 
header3 
header9 
header8 

Ich möchte eine Liste erhalten (wenn möglich, einzigartig) aller header1 Werte, für jeden der Wert in den dafür vorgesehenen Header (es ist in einem sein kann Datei oder irgendetwas).

+0

Es klingt also wie ein Join zwischen Tabellen (Dateien) basierend auf einer gemeinsamen Spalte ('header1'). Fasst das zusammen, was du brauchst? – YoYo

+0

@YoYo Ja. Das ist was ich brauche. – pam

+0

Es scheint mir bequemer zu sein, die Daten in die Datenbank zu laden und dazu SQL zu verwenden oder APIs zu verwenden, die SQL-ähnliche Operationen auf beliebigen Datensätzen anbieten. Ist das überhaupt eine Option? – YoYo

Antwort

1

Ich bin der Autor der Bibliothek und nur ein Problem mit der Feldauswahl gefunden, wenn nicht übereinstimmende Header-Namen (siehe here).

Versuchen Sie, die neueste Version (2.1.1-SNAPSHOT) und wenn Sie Header auswählen, die nicht in der Eingabedatei vorhanden sind, erhalten Sie das erwartete Ergebnis.

Hoffe, das hilft.

+0

Vielen Dank für die Antwort. Ich sehe 2.1.1 hier nicht aufgelistet: https://oss.sonatype.org/content/repositories/releases/com/univocity/univocity-parsers/ – pam

+0

es ist ein Snapshot Build derzeit: https: //oss.sonatype .org/content/repositories/snapshots/de/univocity/univocity-parsers/2.1.1-SNAPSHOT / –

Verwandte Themen