Задача: разумное объединение файлов CSV - PullRequest
2 голосов
/ 31 марта 2010

Мы находимся в процессе изменения платформы интернет-магазина, и нам нужно импортировать данные о товарах из разных источников.

В настоящее время у нас есть несколько разных CSV-файлов из разных систем / баз данных, потому что в каждой системе отсутствует некоторая информация. К счастью, идентификаторы продуктов одинаковы, поэтому можно связать данные с помощью идентификаторов.

Нам нужно объединить эти данные в один большой CSV-файл, чтобы мы могли импортировать его на наш новый сайт электронной коммерции.

Мой вопрос: существует ли общий подход, когда вам нужно объединить CSV-файлы со связанными данными в один CSV-файл? Существуют ли какие-либо приложения или инструменты, которые могут вам помочь?

Ответы [ 6 ]

3 голосов
/ 31 марта 2010

Если вы используете R , вы можете загрузить файлы CSV, а затем выполнить любой запрос, как если бы вы работали с таблицами в базе данных.

Например, вы можете использовать команду, подобную следующей для каждого csv

table1 <- read.csv("D:/table1.csv", header=T, sep=",", na.strings=c(".", "NA", "", "?"))

Затем загрузите пакет sqldf

library(sqldf)

И выполнять запросы

table3 <- sqldf("SELECT X1, X2, X3 FROM table1 JOIN table2 USING(X1)")

Наконец, экспортируйте результаты как новый csv

write.csv(table3 , file = "D:/temp/table3.csv")
2 голосов
/ 01 апреля 2010

Я написал TxtSushi для выполнения выбора SQL и некоторых других простых преобразований в файлах плоских файлов. Например, вы можете сделать что-то вроде следующего:

tssql -table t1 tbl1.csv -table t2 tbl2.csv \
'select * from t1 inner join t2 on t1.id=t2.id'

Здесь много примеров сценариев . Он распространяется как пакет на http://hackage.haskell.org, поэтому установка зависит от платформы Haskell .

2 голосов
/ 31 марта 2010

Конечно, любой язык программирования / инструменты, способные манипулировать файлами, могут выполнять эту работу (Python / Perl / PHP / Ruby / awk и другие). пример с инструментом awk * nix, обрабатывающим 2 файла csv с использованием поля 1 в качестве общего ключа

awk -F"," 'FNR==NR{
  d[$1]=$0
  next
}
{
  print d[$1],$0
}' file1 file2
2 голосов
/ 31 марта 2010

Да. Используйте Python и модуль csv.

Чтение, создание объединенного набора результатов и запись.

import csv

products = {}
with open( "one file.csv", "rb" ) as source:
    rdr = csv.DictReader( source )
    for row in rdr:
        products[row['somekeycolumn']] = row # or maybe some rearrangement

with open( 'another file.csv', 'rb' ) as source:
    rdr = csv.DictReader( source )
    for row in rdr:
        if row['adifferentkey'] in products:
            # maybe update?
        else:
            products[row['adifferentkey']] = row # or maybe some rearrangement

with open( 'result.csv', 'wb' ) as target:
    wtr = csv.writer( target ) 
    wtr.writerow( ['the','heading','columns'] )
    for name in sorted( product ) ):
        wtr.writerow( products[name] )

Что-то в этом роде.

1 голос
/ 31 марта 2010

почему бы просто не загрузить каждый CSV-файл в общую таблицу ввода, а затем использовать SQL для слияния в постоянные таблицы оттуда. Примеры таблиц ввода:

InputCSVFiles
FileID     int PK auto number/identity
FileName   string
FileHash   string

InputCVSItems
ItemID     int PK auto number/identity
FileID     FK
ProductID
Col1
Col2
...

просто загрузите каждый файл в таблицы, можете использовать хеш файла для предотвращения загрузки дубликата файла. Затем вы можете использовать SQL для идентификации дубликатов и использовать SQL для ВСТАВКИ, используя SELECT в постоянные таблицы по мере необходимости. Я не уверен, сколько дублирующих продуктов существует, но работать с ними в SQL довольно легко с помощью самообъединений, COALESCE (), ROW_NUMBER (), GROUP BY, MIN () и т. Д.

INSERT INTO Product
        (ProductID, col1, col2, ...)
    SELECT
        ProductID, col1, col2, ...
        FROM InputCVSItems
        ...
0 голосов
/ 26 декабря 2013

Однажды я написал утилиту "dsv2sql" , которая делает именно то, что вам нужно. Вот пример команды:

./dsv2sql --delimiter=, --output=csv --uid=id one.csv two.csv > combined_one_two.csv

Естественно, что ожидается ввод CSV-файлов с заголовками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...