java - 连接两个 .csv 文件

标签 java database csv join merge

我想按如下所示的方式合并两个 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

我考虑使用 CSV 库通过一个小型 Java 程序来解决这个问题,而不是手动处理文件。但我想知道是否有更好的方法来做到这一点。

最佳答案

如果您想在中间步骤中不使用数据库来处理 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

数据库.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

关于java - 连接两个 .csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42342244/

相关文章:

java - Spring boot - 没有嵌入式tomcat的Rest Call客户端

Java数字模式两个三角形并排形成一个正方形/矩形

php - 如何显示数据库中的 BLOB 图像?

mysql - 复合键为空且插入时约束失败

python - 读取 csv 文件最后一行的第二列

java - 在 Java 中将文本文件表示为单个单元,并匹配文本中的字符串

Java - 从 .dat 文件中获取某些信息并将其放入 .idx 文件中

database - 如何将正在使用的数据库复制到django中的其他数据库?

python - Pandas 导入多索引 csv,其索引级别位于同一列

c - 如何读取 CSV 文件中的特定信息