Добавить столбец из одного .csv в другой .csv-файл

indicator-network работает с ConnMan вместо NetworkManager, и, судя по их сайту, ConnMan не поддерживает PPP в настоящее время (его можно добавить с помощью плагина, если таковой существует). (Также этот индикатор будет использоваться только для Netbook Edition, а не для Desktop Edition.)

1
задан 24 November 2014 в 20:26

4 ответа

Вот красавица (я думаю):

join -t, <(csvcut -c 1,3,4 file1.csv) <(csvcut -c 1,2 file2.csv)

Разбито по шагам:

Шаг 1. Установите csvkit:

sudo pip install csvkit
sudo apt-get install python-dev python-pip python-setuptools build-essential

Шаг 2. Используйте команду соединения с запятой как разделитель

join -t,

Шаг 3. Загрузите фактические столбцы, которые вы хотите. Обратите внимание на то, как вы кормите его первым столбцом дважды, потому что это то, на котором фактически выполняется соединение (поведение по умолчанию join).

join -t, <(csvcut --columns 1,3,4 file1.csv) <(csvcut --columns 1,2 file2.csv)

или в сокращении:

join -t, <(csvcut -c 1,3,4 file1.csv) <(csvcut -c 1,2 file2.csv)

При желании вы можете перенаправить этот стандартный вывод в файл (желаемый результат).

Преимущества

Этот метод имеет несколько преимуществ по сравнению с другими предложенными.

Прежде всего, он выполняет реальное соединение. Это означает, что его можно использовать и для более сложных данных. Например, очень просто сделать соединение в другом поле. Он не просто смотрит на положение поля, но он действительно учитывает колонку. Он действительно работает с форматом данных (csv) и не воспринимает его как текст.

Во-вторых, он использует очень мощный инструментарий csv, который также позволяет вам: a) отображать статистику с помощью одной команды ([ f7], b) проверить, чист ли данные (csvclean), но также преобразовать его в json, в sql или даже загрузить в python! Этот инструментарий широко используется в науке о данных для подготовки данных.

8
ответ дан 24 May 2018 в 01:36
  • 1
    Если вы устанавливаете на Ubuntu, вам может потребоваться установить заголовки разработки Python до установки csvkit: sudo apt-get install python-dev python-pip python-setuptools build-essential - link – karel 24 November 2014 в 20:42
  • 2
    Удивительный ответ, я работаю над сервером компании, поэтому установка занимает около недели бумажной работы. Работает на моей машине, хотя! – Roboman1723 24 November 2014 в 22:10
  • 3
    +1 для показа мне еще один инструмент для CSV-данных. Отдельный вопрос, но знаете ли вы об автономном писателе отчетов для файлов данных CSV? – Joe 27 November 2014 в 04:38
  • 4
    @Joe вы можете быть более конкретным о том, что вы имеете в виду, когда говорите о «докладчике»? Я не уверен, что понимаю, что вы имеете в виду. – don.joey 27 November 2014 в 13:03
  • 5
    Я разместил отдельный вопрос в unix.stackexchange.com/questions/170199/… – Joe 27 November 2014 в 15:18

Вот еще одна красивая. Я думаю, что это самый простой из всех предложений.

csvtool pastecol 2 2 file1.csv file2.csv

Если вы еще не установили csvtool в прошлом, вы должны sudo apt-get install csvtool.

Из документов:

pastecol <column-spec1> <column-spec2> input.csv update.csv
Замените содержимое столбцов, на которые ссылается в файле input.csv, на соответствующий столбец, указанный в файле update.csv. Пример:
  csvtool pastecol 2-3 1- input.csv update.csv.csv > output.csv

Обратите внимание, как в нашем случае мы заменяем второй столбец файлов.

Примеры

file1.csv

[ f4]

file2.csv

A,B
A,B
A,B
A,B

Объединение двух файлов:

csvtool pastecol 2 2 file1.csv file2.csv
A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D

Что вы в основном делаете, вставьте столбец два из file2.csv в качестве столбца 2 в file1.csv.

Обратите внимание, что это также работает в том же документе. Если вы хотите поменять два столбца, вы можете сделать это, используя тот же файл, что и input.csv и update.vsc.

csvtool pastecol 2 1 file2.csv file2.csv 
A,A
A,A
A,A 
A,A
6
ответ дан 24 May 2018 в 01:36

Чтобы переместить выбранное количество столбцов из одного файла в другой:

#!/usr/bin/env python3

cols = 1; file_1 = "/path/to/file_1"; file_2 = "/path/to/file_2"

def readfile(file):
      with open(file) as src:
          return [item.strip().split(",") for item in src.readlines()]

file_1 = readfile(file_1); file_2 = readfile(file_2)

for i in range(len(file_1)):
    print((",").join(file_1[i]+file_2[i][-cols:]))

из двух файлов:

file_1

A,B
A,B
A,B
A,B

file_2 [ ! d3]

K,L,M
K,L,M
K,L,M
K,L,M

Когда вы устанавливаете cols = 1:

A,B,M
A,B,M
A,B,M
A,B,M

Но когда вы установите cols = 2:

A,B,L,M
A,B,L,M
A,B,L,M
A,B,L,M

cols = 3:

A,B,K,L,M
A,B,K,L,M
A,B,K,L,M
A,B,K,L,M

Как использовать

Скопируйте его в пустой файл, установите путь к file1, file2 и количество столбцов для перемещения, сохраните его как move.py и запустите его:

python3 /path/to/move.py

Также можно добавить один или несколько столбцов из середины колонок исходного файла.

2
ответ дан 24 May 2018 в 01:36
  • 1
    Было бы приятно видеть, что вы используете import csv. – don.joey 24 November 2014 в 22:02
  • 2
    @ don.joey Спасибо за предложение, обязательно рассмотрим его. – Jacob Vlijm 24 November 2014 в 23:40

Другой метод в python через модуль csv.

script.py

#!/usr/bin/python3
import csv
import sys
file1 = sys.argv[1]
file2 = sys.argv[2]
with open(file2, 'r') as r:
    with open(file1, 'r') as f:
        csv_f = csv.reader(f)
        csv_r = csv.reader(r)
        bar = [linex for linex in csv_r]
        foo = [liney[2:] for liney in csv_f]
        zipped = zip(bar,foo)
        result = [x+y for (x,y) in list(zipped)]
        for i in result:
            print(','.join(i))

Чтобы запустить указанный скрипт,

python3 script.py file1 file2

Выход: [ ! d3]

A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
0
ответ дан 24 May 2018 в 01:36

Другие вопросы по тегам:

Похожие вопросы: