У меня есть около 50 файлов CSV с 60 000 строк в каждом и различное количество столбцов. Я хочу объединить все CSV-файлы по столбцу. Я попытался сделать это в MATLAB, перенести каждый файл csv и повторно сохранить на диск, а затем используя командную строку для их конкатенации. Это заняло мой компьютер в течение недели, и окончательный результат нужно перенести еще раз! Я должен сделать это снова, и я ищу решение, которое не займет еще неделю. Любая помощь будет оценена по достоинству.Какой самый быстрый способ объединить несколько файлов CSV по столбцу?
ответ
[...] перенося каждый файл CSV и повторно сохранение на диск, а затем с помощью командной строки, чтобы объединить их [...]
Похоже транспозиции-Cat-Транспонирование. Используйте paste для соединения файлов по горизонтали.
paste -d ',' a.csv b.csv c.csv ... > result.csv
Отличное решение - он может даже объединить очень большие файлы csv, которые даже не загружаются в память (например, в python). Операция выполняется по строкам, поэтому проблем с памятью не возникает. – Tickon
Модуль Python csv
может быть настроен так, что каждая запись является словарем с именами столбцов в виде ключей. Вы должны таким образом иметь возможность читать во всех файлах как словари и записывать их в файл, содержащий все столбцы.
Python прост в использовании, поэтому это должно быть довольно тривиально для программиста любого языка.
Если у ваших csv-файлов нет заголовков столбцов, это будет довольно много ручной работы, хотя, возможно, это не лучшее решение.
Поскольку эти файлы довольно большие, лучше не читать их все в памяти один раз. Я бы рекомендовал сначала открыть их только для того, чтобы собрать все имена столбцов в список и использовать этот список для создания выходного файла. Затем вы можете объединить каждый входной файл в выходной файл без необходимости иметь все файлы в памяти.
Мои файлы имеют заголовки. Я просто хочу, чтобы все файлы были объединены по горизонтали. Является ли это быстродействием для размеров файлов? (отметьте комментарий к вопросу). – ankit
@ankit: Да, никаких проблем. Обновлен ответ. (Это забавная проблема, если бы у меня было время, я бы сделал это за вас, но я этого не делаю, я должен угодить клиентам. :-)) –
Эй, Леннарт, прежде чем вы отправитесь, не могли бы вы просто перечислить имена функций/методов, которые мне понадобятся? Я могу использовать их для использования и выяснить остальные. Спасибо :) – ankit
Горизонтальная конкатенация действительно тривиальна. Учитывая, что вы знаете C++, я удивлен, что вы использовали MATLAB. Обработка GB или так данных в том, как вы делаете, должна быть в секундах, а не в днях.
По вашему описанию, обработка CSV на самом деле не требуется. Самый простой подход - просто сделать это в ОЗУ.
vector< vector<string> > data(num_files);
for(int i = 0; i < num_files; i++) {
ifstream input(filename[i]);
string line;
while(getline(input, line)) data[i].push_back(line);
}
(ли очевидные проверки вменяемости, например, убедившись, что все векторы имеют одинаковую длину ...)
Теперь у вас есть все, дамп:
ofstream output("concatenated.csv");
for(int row = 0; row < num_rows; row++) {
for(int f = 1; f < num_files; f++) {
if(f == 0) output << ",";
output << data[f][row];
}
output << "\n";
}
Если вы не» t хотите использовать всю эту ОЗУ, вы можете сделать это по одной строке за раз. Вы должны иметь возможность держать все файлы открытыми сразу и просто хранить объекты ifstream
в списке vector/array /. В этом случае вы просто читаете по одной строке за раз из каждого файла и записываете его на выход.
Как я понимаю, есть некоторые манипуляции с CSV, что означает, что вам нужно также проанализировать CSV. Так что этого недостаточно. –
import csv
import itertools
# put files in the order you want concatentated
csv_names = [...whatever...]
readers = [csv.reader(open(fn, 'rb')) for fn in csv_names]
writer = csv.writer(open('result.csv', 'wb'))
for row_chunks in itertools.izip(*readers):
writer.writerow(list(itertools.chain.from_iterable(row_chunks)))
Сцепляет горизонтально. Предполагается, что все файлы имеют одинаковую длину. Обладает низкой памятью и ускорен.
Относится к Python 2.В Python 3, открытие файлов CSV немного отличается:
readers = [csv.reader(open(fn, 'r'), newline='') for fn in csv_names]
writer = csv.writer(open('result.csv', 'w'), newline='')
Использование Go: https://github.com/chrislusf/gleam
Предположим, есть файл "a.csv" имеет поля "a1, a2, a3, a4, a5".
И предположим, что файл «b.csv» имеет поля «b1, b2, b3».
Мы хотим присоединиться к строкам, где a1 = b2. Формат вывода должен быть «a1, a4, b3».
package main
import (
"os"
"github.com/chrislusf/gleam"
"github.com/chrislusf/gleam/source/csv"
)
func main() {
f := gleam.New()
a := f.Input(csv.New("a.csv")).Select(1,4) // a1, a4
b := f.Input(csv.New("b.csv")).Select(2,3) // b2, b3
a.Join(b).Fprintf(os.Stdout, "%s,%s,%s\n").Run() // a1, a4, b3
}
- 1. Каков самый быстрый способ объединить несколько байт []?
- 2. Самый быстрый способ для хранения CSV-файлов
- 3. Самый быстрый способ объединить несколько текстовых файлов без повторяющихся строк
- 4. Android самый быстрый способ читать несколько файлов?
- 5. Сочетание CSV-файлов по столбцу
- 6. Каков самый быстрый способ простого слияния файлов и какой самый быстрый способ разделить массив?
- 7. Какой самый быстрый способ объединить несколько файлов в файл в C#?
- 8. Самый быстрый способ объединить несколько файлов csv на основе значения 1-го столбца
- 9. Какой будет самый быстрый способ?
- 10. Самый быстрый способ конкатенировать несколько файлов column wise - Python
- 11. Объединить несколько файлов csv
- 12. Какой самый простой способ выполнить несколько файлов
- 13. Каков самый быстрый способ для нескольких файлов?
- 14. Какой самый быстрый способ получить вывод CSV в фрейм данных?
- 15. Какой самый быстрый способ открыть представление LogCat?
- 16. Какой самый быстрый способ скопировать строку mysql?
- 17. Какой самый быстрый способ сканирования файлов на диске FAT32?
- 18. Какой самый быстрый способ установить массив numpy?
- 19. Какой самый быстрый способ петли? [for любопытство]
- 20. Какой самый быстрый способ запустить несколько PHP-CLI?
- 21. Какой самый быстрый способ добавить несколько кадров в конце видео?
- 22. Какой самый быстрый способ умножить несколько ячеек на другой номер?
- 23. Самый быстрый способ экспортировать XLSX в CSV
- 24. Самый быстрый способ создания файлов на C#
- 25. Какой самый быстрый способ сравнить векторы в C++?
- 26. Какой самый быстрый способ разобрать эту строку
- 27. Какой самый быстрый способ получить онлайн компьютеры
- 28. PHP Какой самый быстрый способ подсчета строк?
- 29. Какой самый простой способ сделать быстрый сбой?
- 30. Какой самый быстрый способ получить подкап карты
Вы знакомы с Perl, хотя бы немного? – mvp
Нет, совсем нет. Я знаю C и C++. – ankit
50 раз 60000 строк не звучит как много. Каков общий размер данных? Не подходит ли она в памяти? – paddy