2016-01-21 7 views
6

Szenario erhalten:Wie der Neuordnungs die Säule mit csv Eingang fester Säule in pentaho

Ich habe Transformation erstellt Daten in Tabelle aus CSV-Datei zu laden, und ich habe folgende Spalten in CSV-Datei:

  1. CUSTOMER_ID
  2. company_id
  3. EMPLOYEE_NAME

Aber Benutzer kann Eingabedatei geben, mit die Reihenfolge der Spalten (zufällige Reihenfolge) als

  1. EMPLOYEE_NAME
  2. company_id
  3. CUSTOMER_ID

so, wenn ich versuche, Datei zu laden, die zufällige Reihenfolge der Spalten hat, wird Last korrekter Spaltenwerte Kessel per Spaltennamen ...?

+0

Sie könnten es möglicherweise mit einem 'UDJC' oder JavaScript tun, wenn die Spaltenüberschriften immer in der Datei waren, aber die beste Lösung ist wahrscheinlich, die Benutzer zurück zu drängen und sie Ihnen zu geben eine richtig formatierte Datei. –

+0

Hallo @ Brian.D.Myers können Sie mir ein Beispiel mit ktr-Datei mit einem UDJC oder JavaScript geben, um mit meiner Frage fortzufahren ... hoch apperiated – yuvi

Antwort

3

Mit ETL Metadata Injection Sie eine Transformation wie diese verwenden können, entweder, um die Daten zu normalisieren, oder es zu Ihrer Datenbank zu speichern:

Metadata transformation

Dann senden müssen Sie nur noch die richtigen Daten zu dieser Transformation. Sie können die Kopfzeile aus der CSV-Datei lesen und Row Normaliser verwenden, um in das von ETL Metadata Injection verwendete Format zu konvertieren.

Ich habe ein kurzes Beispiel hier: csv_inject on Dropbox, wenn Sie so etwas machen und es von etwas ausführen, die es pro CSV-Datei läuft es sollte funktionieren.

+0

Ihr Link funktioniert nicht – Stevetech

0

Man könnte so etwas wie dies, wie sie JavaScript versuchen:

//Script here 

var seen; 
trans_Status = CONTINUE_TRANSFORMATION; 
var col_names = ['Customer_Id','Company_Id','Employee_Name']; 
var col_pos; 
if (!seen) { 
    // First line 
    trans_Status = SKIP_TRANSFORMATION; 
    seen = 1; 
    col_pos = [-1,-1,-1]; 
    for (var i = 0; i < col_names.length; i++) { 
     for (var j = 0; j < row.length; j++) { 
      if (row[j] == col_names[i]) { 
       col_pos[i] = j; 
       break; 
      } 
     } 
     if (col_pos[i] === -1) { 
      writeToLog("e", "Cannot find " + col_names[i]); 
      trans_Status = ERROR_TRANSFORMATION; 
      break; 
     } 
    } 
} 

var Customer_Id = row[col_pos[0]]; 
var Company_Id = row[col_pos[1]]; 
var Employee_Name = row[col_pos[2]]; 

Hier die .ktr ist ich versucht: csv_reorder.ktr

(bearbeiten, hier sind die Test csv-Dateien) 1.csv:

Customer_Id,Company_Id,Employee_Name 
cust1,comp1,emp1 

2.csv:

Employee_Name,Company_Id,Customer_Id 
emp2,comp2,cust2 
+0

können Sie mir die Probe basierend auf meinem Beispiel .. ich bin nicht bekommen Ihr ktr..using Java-Code ... gibt es eine andere Möglichkeit, anstelle von Java-Code – yuvi

+0

zu verfahren Dies basiert auf Ihrem Beispiel. Was meinst du damit, "dein ktr nicht zu bekommen"? – bolav

+0

Ich habe versucht, Ihre csv_reorder.ktr..aber ich erwarte keine Ausgabe – yuvi

2

Ooh, das ist ein böses Javascript!

Der Weg dazu ist mit Metadaten-Injektion. Schauen Sie sich die Beispiele an, aber im Grunde benötigen Sie eine Vorlage, die die Datei liest und wieder ausgibt. Sie verwenden dann eine andere übergeordnete Transformation, um die Überschriften herauszufinden, diese Vorlage zu konfigurieren und sie dann auszuführen.

Es gibt Beispiele im Ordner PDI-Beispiele, und werfen Sie auch einen Blick auf das Beispiel "herauszufinden, Dateiformat" in Matt Casters Blueprints Projekt auf GitHub.

+0

Huh. Ich habe es mit dem 'ETL metadata injection'-Schritt versucht, aber ich habe es nie zuvor benutzt. Ich schätze, ich sollte es noch einmal versuchen. In der Vergangenheit habe ich solche Dinge mit einem Python-Skript vorverarbeitet. –

+0

Dies ist keine sehr konstruktive Antwort. Vor allem sagst du, dass eine Lösung schlecht ist, ohne zu sagen, was schlecht daran ist. Und dann sagst du, dass eine andere Lösung existiert, ohne zu sagen, wie sie gelöst werden kann. Ich habe nichts aus Ihrer Antwort gelernt, außer dass eine andere Antwort existiert. – bolav

+0

@codek ... können Sie mir Beispiel geben und erklären ... Fortschritt Danke – yuvi

0

Wenn Sie davon ausgehen, dass die Eingabedatei abgelehnt wird, haben Sie im Grunde keine 4 Lösungen.

  1. neu ordnen Sie die Felder in einem externen Editor (nicht verwenden Excel, wenn es Daten enthält)
  2. Benutzen Sie den Code in Ihrer Transformation der Spaltenüberschriften und neu anordnen, die Datei zu erfassen.
  3. Verwenden Sie die Metadateninjektion wie von Bolav vorgeschlagen
  4. Erstellen Sie einen Job. Dieses muss:

a. Laden Sie die Datei in eine temporäre Datenbank. b. Verwenden Sie eine SQL-Anweisung, um die Felder abzurufen (verwenden Sie eine SELECT-Anweisung mit einer ORDER By-Klausel) c. Ausgabe der Datei in der richtigen Reihenfolge