2016-05-14 13 views
0

Ich habe einen Job erstellt, der die Daten aus einer Datei liest und basierend auf den eindeutigen Daten einer bestimmten Spalte den Datensatz in viele Dateien aufteilt.Zählen Sie die Anzahl der Zeilen für jede Datei zusammen mit dem Dateinamen in Talend

Ich bin in der Lage, die Anforderung durch die unten Job acheive:

enter image description here

nun von diesem Job, der die Ausgabe in mehrere Dateien aufgeteilt, was ich will, ist eine Unter Job hinzuzufügen, die geben würde, Ich zwei Spalten.

In der ersten Spalte möchte ich den Namen der Dateien, die ich in meinem Hauptauftrag erstellt habe und in der zweiten Spalte möchte ich die Anzahl der Zeilen, die jede erstellte Ausgabedatei hat.

Um dies zu erreichen, benutzte ich tflowmeter und um das Ergebnis der Zählung abzufangen, benutzte ich den tFlowmeterCatcher, der mir korrekte Ergebnisse für die Anzahl der Zeilen für die entsprechenden Ausgabedateien gibt, aber den letzten Dateinamen in allen angibt Dateien, die ich für die Zählungen generiert habe.

Wie bekomme ich die richtigen Dateinamen und die entsprechende Zeilenanzahl.

+0

Können Sie '(String) globalMap.get (" tFileInputPositional_1_CURRENT_FILE ")' verwenden, um den aktuellen Dateinamen im zweiten Fluss zu erhalten? Füge es einfach als Wert in 'tMap_2' hinzu. – tobi6

+0

@ tobi6 Wenn ich den globalen Parameter verwende, den Sie vorgeschlagen haben, gibt er mir einen Nullwert. Was ich verwendet habe, war ((String) globalMap.get ("row7.newColumn1")) Parameter, aber es gibt mir den letzten Dateinamen für alle eindeutigen Datensätze. Kannst du mit einer anderen Logik helfen? – user3454116

+0

Ok, ich hätte '(String) globalMap.get (" tFileInputPositional_1_CURRENT_FILE ")' da nehmen sollen, aber das wird nicht so gut funktionieren, weil tFlowMeterCatcher nach dem oberen Job ausgeführt wird. Was versuchst du zu erreichen? – tobi6

Antwort

1

Wenn Sie die folgenden Anweisungen verwenden, Ihre Arbeit am Ende haben zusätzliche Komponenten wie so:

Extended flow for row count and filename

Verwenden Sie ein tJavaFlex direkt nach dem auf Haupt tFileOutputDelimited. Es sollte wie folgt aussehen:

Start Code: int countRows = 0; 
Main Code: countRows = countRows + 1; 
End Code: globalMap.put("rowCount", countRows); 

Verbinden Sie diese Komponente OnComponentOk mit der ersten Komponente eines neuen Subjob. Dieser Sub-Job enthält eine tFixedFlowInput, eine tJavaRow und eine tBufferOutput.

Die tFixedFlowInput ist gerade hier, so dass die OnComponentOk angeschlossen werden kann, nichts geändert werden muss. In tJavaRow setzen Sie wie folgt vor:

output_row.filename = (String)globalMap.get("row7.newColumn"); 
//or whatever is your row variable where the filename is located 

output_row.rowCount = (Integer)globalMap.get("rowCount"); 

Im Schema fügen Sie die folgenden Elemente:

Flow variables filename and rowCount

Fügen Sie einfach einen tBufferOutput jetzt am Ende des ersten Subjob.

Erstellen Sie jetzt einen weiteren neuen Unterjob mit den Komponenten tBufferInput und welche Komponenten Sie benötigen, um die Daten zu verarbeiten und zu speichern.Verbinden Sie die erste Komponente Ihres Jobs mit einer OnSubjobOk mit der tBufferInput Komponente. Ich benutzte ein tLogRow das Ergebnis zeigen (mit meiner zufällig gefälschten Daten erstellt):

.---------------+--------. 
|  LogFileData  | 
|=--------------+-------=| 
|filename  |rowCount| 
|=--------------+-------=| 
|fileblerb1.txt |27  | 
|fileblerb29.txt|14  | 
|fileblerb44.txt|20  | 
'---------------+--------' 

HINWEIS: Beachten Sie, dass, wenn Sie einen Header der Datei hinzufügen (Include Header geprüft in tFileOutputDelimited) Möglicherweise muss der Job geändert werden (geben Sie einfach int countRows = 1; oder was immer Sie benötigen). Ich habe diesen Fall nicht getestet.

0

Sie können die tFileproperties-Komponente verwenden, um den Dateinamen zu speichern, der in einem Intermediate-Excel nach dem ersten Sub-Job generiert wurde, und dieses Excel in Ihrem zweiten Sub-Job zu verwenden.

Danke!

+0

Was wäre der Ablauf für den Fall, dass ich die tFileProperties-Komponente verwende. – user3454116