Объединение 2 .csv-файлов общим столбцом

Поэтому у меня есть два CSV-файла, где первая строка в файле 1:

MPID,Title,Description,Model,Category ID,Category Description,Subcategory ID,Subcategory Description,Manufacturer ID,Manufacturer Description,URL,Manufacturer (Brand) URL,Image URL,AR Price,Price,Ship Price,Stock,Condition 

Первая строка из файла 2:

 Regular Price,Sale Price,Manufacturer Name,Model Number,Retailer Category,Buy URL,Product Name,Availability,Shipping Cost,Condition,MPID,Image URL,UPC,Description 

а затем остаток каждого файла заполняется информацией.

Как вы можете видеть, оба файла имеют общее поле, называемое MPID (файл 1: col 1, файл 2: col 9, где первый col – col 1).

Я хотел бы создать новый файл, который объединит эти два файла, посмотрев на этот столбец (как в: если в обоих файлах есть MPID, то в новом файле этот MPID появится как с его строкой из файла 1 и его строка из файла 2). Если один MPID появляется только в одном файле, тогда он также должен войти в этот объединенный файл.

Файлы не сортируются в любом случае.

Как это сделать на дебианском компьютере с скриптом оболочки или python?

Благодарю.

EDIT: Оба файла не имеют запятых, кроме разделяющих поля.

  • Python попытается, наконец, вернуть блок
  • Regex, чтобы найти URL-адреса в строке в Python
  • Python 2.5.2 - что было вместо утверждения 'with'
  • Данные и гистограмма не сталкиваются в matplotlib?
  • Различия в синтаксисе RegEx между Python и Java
  • Colorama для Python, не возвращая цветные линии печати в Windows
  • Python PySide и Progress Bar Threading
  • QTabWidget с CheckBox в заголовке
  • 6 Solutions collect form web for “Объединение 2 .csv-файлов общим столбцом”

     sort -t , -k index1 file1 > sorted1 sort -t , -k index2 file2 > sorted2 join -t , -1 index1 -2 index2 -a 1 -a 2 sorted1 sorted2 

    Это классическая проблема «реляционного объединения».

    У вас есть несколько алгоритмов.

    • Вложенные петли. Вы читаете из одного файла, чтобы выбрать «главную» запись. Вы читаете весь другой файл, в котором указаны все «подробные» записи, соответствующие мастеру. Это плохая идея.

    • Sort-Merge. Вы сортируете каждый файл во временную копию на основе общего ключа. Затем вы объединяете оба файла путем чтения из мастера, а затем читаете все соответствующие строки из детали и записываете объединенные записи.

    • Погляди. Вы читаете один из файлов полностью в словаре в памяти, индексированном по ключевому полю. Это может быть сложным для файла подробностей, где у вас будет несколько детей на ключ. Затем вы читаете другой файл и просматриваете соответствующие записи в словаре.

    Из них сортировка-слияние часто бывает самой быстрой. Это делается полностью с помощью команды сортировки unix.

    Реализация поиска

     import csv import collections index = collections.defaultdict(list) file1= open( "someFile", "rb" ) rdr= csv.DictReader( file1 ) for row in rdr: index[row['MPID']].append( row ) file1.close() file2= open( "anotherFile", "rb" ) rdr= csv.DictReader( file2 ) for row in rdr: print row, index[row['MPID']] file2.close() 

    Вам нужно будет посмотреть на команду join в оболочке. Вам также потребуется отсортировать данные и, вероятно, потерять первые строки. Весь процесс будет падать, если какая-либо из данных содержит запятые. Или вам нужно обработать данные с помощью CSV-чувствительного процесса, который вводит другой разделитель полей (возможно, элемент управления-A), который можно использовать для разделения полей однозначно.

    Альтернатива, использующая Python, считывает два файла в пару словарей (с учетом общих столбцов), а затем использует цикл, чтобы охватить все элементы в меньшем из двух словарей, ища соответствующие значения в другом , (Это основная обработка запросов вложенных циклов.)

    Кажется, что вы пытаетесь сделать в сценарии оболочки, который обычно делается с использованием SQL-сервера. Можно ли использовать SQL для этой задачи? Например, вы можете импортировать оба файла в mysql, затем создать соединение, а затем экспортировать его в CSV.

    Вы можете взглянуть на мой проект FOSS CSVfix , который является редактором потоков для управления CSV-файлами. Он поддерживает объединения, среди других его функций, и не требует использования скриптов.

    Для объединения нескольких файлов (даже> 2) на основе одного или нескольких общих столбцов одним из лучших и эффективных подходов в python будет использование «пивоваренного завода». Вы даже можете указать, какие поля необходимо учитывать для слияния и какие поля необходимо сохранить.

     import brewery from brewery import ds import sys sources = [ {"file": "grants_2008.csv", "fields": ["receiver", "amount", "date"]}, {"file": "grants_2009.csv", "fields": ["id", "receiver", "amount", "contract_number", "date"]}, {"file": "grants_2010.csv", "fields": ["receiver", "subject", "requested_amount", "amount", "date"]} ] 

    Создайте список всех полей и добавьте имя файла для хранения информации о происхождении записей данных. Посредством определений источников и получения полей:

     for source in sources: for field in source["fields"]: if field not in all_fields: out = ds.CSVDataTarget("merged.csv") out.fields = brewery.FieldList(all_fields) out.initialize() for source in sources: path = source["file"] # Initialize data source: skip reading of headers # use XLSDataSource for XLS files # We ignore the fields in the header, because we have set-up fields # previously. We need to skip the header row. src = ds.CSVDataSource(path,read_header=False,skip_rows=1) src.fields = ds.FieldList(source["fields"]) src.initialize() for record in src.records(): # Add file reference into ouput - to know where the row comes from record["file"] = path out.append(record) # Close the source stream src.finalize() cat merged.csv | brewery pipe pretty_printer 
    Interesting Posts

    Python – доступ к значениям, вложенным в словари

    Контроллер TensorFlow предотвращает назначение переменных: график завершен и не может быть изменен

    Форматирование Pandas DataFrame

    Как получить разрывы строк в электронной почте, отправленные с помощью smtplib Python?

    Запуск тестов для учебного курса django невозможен – нет модуля с именем polls.tests

    Как извлечь первое и заключительное слова из строки?

    form.is_valid () всегда возвращает false

    обобщенные кумулятивные функции в NumPy / SciPy?

    Как печатать на консоли в Py Test?

    печатать серии простых чисел в python

    Объяснение переменной «self» python для новичка

    Python, как убивать потоки, заблокированные в очереди с помощью сигналов?

    Способ создания многострочных комментариев в Python?

    Как открыть вспомогательное окно после нажатия кнопки на главном экране в PyQt4

    Существует ли межсетевая инфраструктура GUI, которая поддерживает встраивание HTML-страниц?

    Python - лучший язык программирования в мире.