加入两个.csv文件
问题描述:
我想以下面显示的方式加入两个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库和手动处理文件。但我想知道是否有更好的方法来做到这一点。
答
连接表是什么DBMS - 数据库管理系统 - 通常做。虽然你可以写这个自己,它可能是简单和容易使用自由软件,数据库管理系统(如MonetDB,MariaDB或PostgreSQL):加载这两个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(几种方式做到这一点,例如编程或使用命令行客户端)。
答
如果你想在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
这听起来像一个家庭作业的问题,可以请你发布你已经尝试到目前为止,我们可以看到你的思维过程是什么。 – px06
你到目前为止详细的尝试了什么?这可以在shell中用一条命令来解决:join – frlan
你不能在SQL中“加入”文件。如果你想“加入”它们,你需要先把这些数据放到一个(关系数据库)中。 –