2017-02-20 2 views
0

Ich möchte zwei CSV-Dateien auf die unten gezeigte Weise verbinden. Die Dateien haben immer die gleiche Struktur (z. B. befinden sich immer drei Produkte im Warenkorb).Verbinden Sie zwei .csv-Dateien

"Datenbank":

ProductId, Name, Price 
123, "My Product 1", 99 
223, "My Product 2", 42 
323. "My Product 3", 19 

"Shopping-Cart":

CustomerId, Product1, Product2, Product3 
111, 123, 223, 323 
112, 223, 223, 123 

gewünschte Ausgabe:

CustomerId, Product1, Product1Name, Product1Price, Product2, Product2Name, Product2Price, Product3, Product3Name, Product3Price 
111, 123, "My Product1", 99, 223, "My Product 2", 42, 323, "My Product 3", 19 
112, 223, "My Product2", 41, 223, "My Product 2", 42, 123, "My Product 1", 99 

Ich dachte über die Lösung dieses mit einem kleinen Java-Programm mit eine CSV-Bibliothek und dann die Dateien manuell verarbeiten. Aber ich frage mich, ob es einen besseren Weg dafür gibt.

+1

Das klingt nach einer Hausaufgabenfrage, kannst du bitte posten, was du bisher versucht hast, damit wir deinen Gedankenprozess sehen können. – px06

+1

Was hast du bis jetzt im Detail versucht? Dies kann mit einem Befehl über Shell behoben werden: join – frlan

+1

Sie können keine Dateien in SQL "beitreten".Sie müssen diese Daten zuerst in eine (relationale) Datenbank einfügen, wenn Sie sie "verbinden" wollen. –

Antwort

0

Joining-Tabellen ist, was DBMS - Datenbank-Management-Systeme - in der Regel tun. Während Sie dies selbst schreiben könnten, ist es wahrscheinlich einfacher und einfacher, ein freies Software-DBMS zu verwenden (wie MonetDB, MariaDB oder): Laden Sie die zwei CSV-Dateien in Tabellen des DBMS; schreib eine Join-Abfrage:

SELECT cart_with_product_info AS 
    c.CustomerId, 
    c.Product1, 
    p1.Name AS Product1Name, 
    p1.Price AS Product1Price, 
    c.Product2, 
    p2.Price AS Product2Name, 
    p2.Price AS Product2Price, 
    c.Product3, 
    p3.Name AS Product3Name, 
    p3.Price Product3Price 
FROM 
    shopping_cart AS c, 
    products AS p1, 
    products AS p2, 
    products AS p3 
WHERE 
    p1.ProductId = c.Product1 
    AND p2.ProductId = c.Product2 
    AND p3.ProductId = c.Product3; 

läuft sie und die Ergebnisse als CSV (mehrere Art und Weise, dies zu tun, beispielsweise programmgesteuert oder mit dem Kommandozeilen-Client) erhalten.

1

Wenn Sie die CSV-Dateien bearbeiten möchten, ohne eine Datenbank im Zwischenschritt zu verwenden (was in diesem Fall die bessere Lösung wäre), können Sie die CSV file JDBC driver verwenden.

Finden Sie unten ein Schnipsel, um das Prinzip zu zeigen. (Anmerkung: Keine weiteren Untersuchung wurde andere getan, dann benötigt das Snippet vorzubereiten.)

nehmen folgende Verzeichnisse und Dateien

bin/ 
csv.directory/database.csv 
csv.directory/shopping_cart.csv 
lib/csvjdbc-1.0-31.jar 
src/sub/optimal/Main.java 

database.csv

ProductId, Name, Price 
123,"My Product 1",99 
223,"My Product 2",42 
323,"My Product 3",19 

shopping_cart.csv

111,123,223,323 
112,223,223,123 

Main.java

import java.sql.*; 
import org.relique.jdbc.csv.CsvDriver; 

public class Main { 

    public static void main(String[] args) throws SQLException { 
     String csvDirectory = "csv.directory"; 
     String connURL = "jdbc:relique:csv:"; 
     Connection conn = DriverManager.getConnection(connURL + csvDirectory); 
     try (Statement stmt = conn.createStatement()) { 
      String sql; 
      sql = "SELECT c.CustomerId," 
        + "  c.Product1," 
        + "  (SELECT name" 
        + "  FROM database AS d" 
        + "  WHERE d.ProductId = c.Product1" 
        + "  ) AS Product1Name," 
        + "  (SELECT price" 
        + "  FROM database AS d" 
        + "  WHERE d.ProductId = c.Product1" 
        + "  ) AS Product1Price" 
        + " FROM shopping_cart AS c"; 
      ResultSet results = stmt.executeQuery(sql); 

      boolean append = true; 
      CsvDriver.writeToCsv(results, System.out, append); 
     } 
    } 
} 

kompilieren

javac -d bin/ -cp lib/* src/sub/optimal/Main.java 

Lauf

java -cp bin:lib/* sub.optimal.Main 

Ausgang

CustomerId,Product1,PRODUCT1NAME,PRODUCT1PRICE 
111,123,My Product 1,99 
112,223,My Product 2,42