Автор Тема: Слияние двух файлов при совпадении в строке  (Прочитано 22300 раз)

Оффлайн aliokero

  • Начинающий
  • *
  • Сообщений: 1
Доброго времени суток!

Задача следующая.

Есть к примеру file1.csv:
id1;name1;address1;
id2;name2;address2;
id3;name3;address3;
......

и файл file2.csv:
id1;nick1;group1;
id2;nick2;group2;
id3;nick3;group3;
......

Необходимо получить файл totcal.csv такого типа:
id1; name1; address1; nick1; group1;
id2; name2; address2; nick2; group2;
id3; name3; address3; nick3; group3;

Т.е. сделать поиск по двум файлам и если ID1-n совпадает и там и там, то склеиваем в одну строку.

Ближе к практике: у меня в одном файла ИНН организации и количество сотрудников, а в другом файле опять ИНН организации и её доход с расходом. Мне надо это в один сводный файл обьединить.

Сутки ломаю голову, весь мозг сломал. Понятно дело что это с помощью bash делать. А куда искать? cat , grep, ???
Помогите советом.

Оффлайн aliokero

  • Начинающий
  • *
  • Сообщений: 1
Загуглил и нашёл 2 варианта, но пока оба не подходят:
awk 'BEGIN{ FS=OFS="|" }
     NR == FNR {a[$1]=$0; next}
     NR == FNR + length(a) {b[$1]=$0; next}
     {$3=b[$3]; $4=a[$4]} 1' file3.txt file2.txt file1.txt
-----------------
и второй
awk 'BEGIN {PROCINFO["sorted_in"] = "@ind_num_asc"} {a[$1]=a[$1] FS $2} END {for (i in a) print i a}' file1 file2

Но не подходят они, ничего не получается.

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 099
Сутки ломаю голову, весь мозг сломал. Понятно дело что это с помощью bash делать. А куда искать? cat , grep, ???
Помогите советом.
awk - не bash. Если bash, то bash4 - вроде там есть хэши, в bash3 нет точно. Или Perl.

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
awk 'BEGIN{ FS=OFS="|" }
Поставьте awk (пакеты):
gawk - The GNU version of the awk text processing utility
gawk-profile - The version of gawk with profiling support

Оффлайн aliokero

  • Начинающий
  • *
  • Сообщений: 1
Дополнение:
Делаю я это всё под Windows используя штатный bat винды и в нём использую утилиты GnuWin32. Да, там есть gawk. Но не получается всё равно.
Вот к примеру содержимое одного файла:
1655213996 ; ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "ЯСНАЯ ПОЛЯНА" ; Налог на прибыль ; 212770931.00
4345084418 ; ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "МАСТЕРСОФТ" ; Страховые взносы на обязательное медицинское страхование работающего населения, зачисляемые в бюджет Федерального фонда обязательного медицинского страхования ; 17026.75
7842426272 ; ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "ЕДИНЫЙ ЦЕНТР ПУТЕШЕСТВИЙ" ; Страховые взносы на обязательное социальное страхование на случай временной нетрудоспособности и в связи с материнством ; 23050.67

Вот содержимое второго файла:
1655213996 ; ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "ЯСНАЯ ПОЛЯНА" ;123
4345084418 ; ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "МАСТЕРСОФТ" ; 512
7842426272 ; ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "ЕДИНЫЙ ЦЕНТР ПУТЕШЕСТВИЙ" ; 52

Мне необходимо получить:
1655213996 ; ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "ЯСНАЯ ПОЛЯНА" ; Налог на прибыль ; 212770931.00 ; 123
4345084418 ; ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "МАСТЕРСОФТ" ; Страховые взносы на обязательное медицинское страхование работающего населения, зачисляемые в бюджет Федерального фонда обязательного медицинского страхования ; 17026.75 ; 512
7842426272 ; ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "ЕДИНЫЙ ЦЕНТР ПУТЕШЕСТВИЙ" ; Страховые взносы на обязательное социальное страхование на случай временной нетрудоспособности и в связи с материнством ; 23050.67 ; 52

Т.е. необходимый алгоритм работы:
Берём из первого файла ИНН (к примеру 1655213996), далее во втором файле ищем данный ИНН (1655213996), и как нашли, приклиеваем содержимое ТРЕТЬЕГО столбца к строке из ПЕРВОГО файла.

Как блиН?

Нюанс: Размеры данных файлов очень большие. Примерно по 400-500Мб, по 2 млн.строк. И мне надо будет сделать слияние примерно 10 файлов, поочерёдно. Сначало присоединю сотрудников, потом доход расход, потом адрес, потом телефон, итп
« Последнее редактирование: 14.02.2019 13:08:54 от aliokero »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Проще в базу данных какую-нибудь всё записать и из неё всё выдать ;-)

Онлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 144
    • Email
Проще в базу данных какую-нибудь всё записать и из неё всё выдать ;-)
И так тоже можно, рекомендую SQLiteStudio https://sqlitestudio.pl/index.rvt?act=download, он умеет с CSV работать.
Сноси Винду, переходи на Линукс ! :)

Оффлайн aliokero

  • Начинающий
  • *
  • Сообщений: 1
LibreOffice Calc и сводная таблица - подвисает и не может провернуть 2 файла.

Я вот тоже думал выгрузить это всё в mysql и там поработать. Но много ли дискового пространства под это потребуется? Просто я думаю что на лаптопе такие файлы не провернуть. Ещё я с содроганием смотрю на несколько XML файлов объёмом по 25 Гб каждый.  Сначало в csv конвертнуть, а потом в mysql грузить.

Блин это жесть.

Никто не имел опыта работы с Открытыми Данными из Налоговой?

Онлайн berkut_174

  • Мастер
  • ***
  • Сообщений: 7 144
    • Email
LibreOffice Calc
Я похоже поспешил со сводной таблицей, мне кажется там так не выйдет. Пробуйте SQLiteStudio, она точно кушает CSV. Потом запросами просто данные втащите куда нужно и обратно в CSV экспортируете.
Сноси Винду, переходи на Линукс ! :)

Оффлайн aliokero

  • Начинающий
  • *
  • Сообщений: 1
А если аналогичную задачу в рамках mysql решать, то не поможете с sql запросом? чтоб обьединить таблицы?

Примечание: может такое быть что в первой таблицы по одному ИНН есть несколько записей (разные налоговые отчисления). И как тогда будет склейка происходить?
« Последнее редактирование: 14.02.2019 13:59:55 от aliokero »

Оффлайн sb

  • Модератор глобальный
  • *****
  • Сообщений: 8 991
Тема из разряда поиска решений и инструментария, поэтому перенос в соответствующий раздел. Одним программированием тут не обойтись судя по всему.
Делаю я это всё под Windows используя штатный bat винды и в нём использую утилиты GnuWin32
А вот это ключевое словосочетание я почему-то пропустил.
Как блиН?
На винде тут мало кто в курсе, потому что форум по линуксу и у большинства здесь линукс установлен, поэтому и советы применительно к линуксу даются.

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 099
Тема из разряда поиска решений и инструментария, поэтому перенос в соответствующий раздел. Одним программированием тут не обойтись судя по всему.
На bash4, либо Perl это не сложно. Я даже начал на bash4 с утра в качестве разминки (пока не пробовал, как там с хэшами, плюс регулярки надо посмотреть башевские - они и в bash3 есть, но крайне редко использую, синтаксис забывается), но работа отвлекла и бросил пока. :-)

Оффлайн Александр Ерещенко

  • Завсегдатай
  • *
  • Сообщений: 1 153
А если аналогичную задачу в рамках mysql решать, то не поможете с sql запросом? чтоб обьединить таблицы?

Примечание: может такое быть что в первой таблицы по одному ИНН есть несколько записей (разные налоговые отчисления). И как тогда будет склейка происходить?

Если не ошибся, то так:
SELECT table1.id, table1.name, table1.address, table2.nick, table2.group FROM table1 INNER JOIN table2 ON table1.id = table2.id ;

Примечание: может такое быть что в первой таблицы по одному ИНН есть несколько записей (разные налоговые отчисления). И как тогда будет склейка происходить?
Склеит. Будет несколько записей с  одинаковым id

Оффлайн aliokero

  • Начинающий
  • *
  • Сообщений: 1
Цитата: aliokero от Сегодня в 13:06:51
Делаю я это всё под Windows используя штатный bat винды и в нём использую утилиты GnuWin32
А вот это ключевое словосочетание я почему-то пропустил.

Windows то Windows но использую GnuWin32 - это пакет *nix утилит.

Оффлайн aliokero

  • Начинающий
  • *
  • Сообщений: 1
Код: [Выделить]
SELECT table1.id, table1.name, table1.address, table2.nick, table2.group FROM table1 INNER JOIN table2 ON table1.id = table2.id ;
Судя по памяти и данной документации: линк
Используя INNER join мы можем потерять данные из первой таблицы.
Т.е. склеиваем две таблицы на основании первой. Если нет пересекающихся ID то данные из первой будут утеряны. А это плохо. Можно просто их пустыми оставлять и всё. Т.е. не заполнять данные в ячейке ( типа null или как то так).

Судя по всему надо использовать FULL Join. Что вы думаете?