2017-02-20 30 views
0

以下のように2つのCSVファイルを結合します。 ファイルの構造は常に同じです(たとえば、カートには常に3つの製品があります)。2つの.csvファイルを結合する

は、 "データベース":

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

"ショッピング・カート":私は使用して小さなJava-のprogrammでこれを解決することについて考え

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 

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

が出力を募集CSVライブラリを作成し、ファイルを手動で処理するよりも簡単です。しかし、これを行うより良い方法があるのだろうかと思います。

+1

これは宿題に関する質問のように聞こえますが、これまでに試した内容を投稿して、あなたの思考過程を見ることができますか? – px06

+1

これまでに何を詳細に試しましたか?これは1つのコマンドでシェル上でbtwを解決することができます:join – frlan

+1

SQLでファイルを "結合"することはできません。それらのデータに「結合」したい場合は、最初にそのデータを(リレーショナル)データベースに入れる必要があります。 –

答えて

0

結合テーブルとは、通常DBMS(Database Management Systems)のことです。あなたはこれを自分で書くことができますが、おそらく、簡単にフリーソフトウェアDBMS(MonetDBMariaDB、またはPostgreSQLなど)を使用する方が簡単です:2つのCSVファイルをDBMSのテーブルにロードします。結合問合せ書く:

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; 

実行それをしてCSV(例えば、プログラムまたはコマンドラインクライアントを使用して、これを行うには、いくつかの方法)として結果を得ます。

1

中間のステップでデータベースを使用せずにCSVファイルを処理する場合は、この場合はどちらの方が良いソリューションになるのでしょうか?CSV file JDBC driver

下記のスニペットで原則を確認してください。 (注:これ以上の調査はスニペットを準備するために必要な、他の行われていない。)

は、以下のディレクトリとファイル

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

コンパイル

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

実行

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

出力

CustomerId,Product1,PRODUCT1NAME,PRODUCT1PRICE 
111,123,My Product 1,99 
112,223,My Product 2,42 
関連する問題