2017-02-20 17 views
0

Я хочу присоединиться к двум файлам CSV, как показано ниже. Файлы всегда имеют одинаковую структуру (например, в корзине всегда есть три продукта).Присоединяйтесь к двум файлам .csv

"База данных":

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 

Wanted Выход:

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

Что вы пробовали в деталях до сих пор? это может быть решено btw на оболочке с одной командой: join – frlan

+1

Вы не можете «присоединяться» к файлам в SQL.Сначала вам нужно поместить эти данные в (реляционную) базу данных, если вы хотите «присоединиться» к ним. –

ответ

0

Соединительные столы - это то, что СУБД - системы управления базами данных - как правило, делают. Хотя вы могли бы написать это самостоятельно, вероятно, просто и проще использовать СУБД свободного программного обеспечения (например, MonetDB, MariaDB или PostgreSQL): Загрузите два CSV-файла в таблицы СУБД; написать запрос присоединиться:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^