2017-02-20 78 views
0

我想以下面显示的方式加入两个CSV文件。 文件总是具有相同的结构(例如购物车中总是有三种产品)。加入两个.csv文件

“数据库”:

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

“购物手推车”:

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

通缉输出:

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 

我想到了一个小型的Java-PROGRAMM使用解决这个一个CSV库和手动处理文件。但我想知道是否有更好的方法来做到这一点。

+1

这听起来像一个家庭作业的问题,可以请你发布你已经尝试到目前为止,我们可以看到你的思维过程是什么。 – px06

+1

你到目前为止详细的尝试了什么?这可以在shell中用一条命令来解决:join – frlan

+1

你不能在SQL中“加入”文件。如果你想“加入”它们,你需要先把这些数据放到一个(关系数据库)中。 –

回答

0

连接表是什么DBMS - 数据库管理系统 - 通常做。虽然你可以写这个自己,它可能是简单和容易使用自由软件,数据库管理系统(如MonetDBMariaDBPostgreSQL):加载这两个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