Полная форма CSV — значение, разделенное запятыми. Файл CSV используется кодировщиком для многих целей, которые хранят данные в табличном формате полуструктур. Каждая строка файла обрабатывается как строка таблицы, и каждое поле строки отделяется запятой (,) в файле CSV. В Bash существует множество способов чтения файлов CSV, которые объясняются в этом руководстве.
Предпосылки:
Вы должны создать файл CSV, прежде чем практиковать пример этого руководства. Создайте файл CSV с именем «customers.csv» со следующим содержимым, чтобы проверить выходные данные сценария, используемого в этой статье. В этом файле 3-е поля 4-й строки и 6-й строки пусты.
ID, имя, электронная почта, адрес, мобильный 101, Andrey Master, Andrey@yandex.ru, 9/A Krasnaya, +89621762341425 102, Alex Murphy, Alex@yandex.ru, 120 Mira, +89621988675345 103, Dimon Avackov,,33/2 Ochakovo, +89621754532312 104, Anna Dimidova, Anna@yandex.ru, 10 Severnaya, +89621512875634 105, Anton Pupkov,, 2/B Krasnaya, +89621700453423
Различные способы чтения файла CSV в Bash
Файл CSV можно анализировать различными способами с помощью сценария Bash. В этой части статьи показаны различные способы чтения файла «customers.csv».
Пример 1. Чтение исходного содержимого CSV-файла
Создайте файл Bash со следующим скриптом, который считывает полное содержимое файла «customers.csv» с помощью цикла while:
#!/bin/bash # установить filename filename="customers.csv" #Считывайте каждую строку файла на каждой итерации while read data do #Распечатать линию echo $data done < $filename
После выполнения скрипта появляется следующий вывод:
andreyex@andreyex:$ bash readcsv1.bash ID, имя, электронная почта, адрес, мобильный 101, Andrey Master, Andrey@yandex.ru , 9/A Krasnaya, +89621762341425 102, Alex Murphy, Alex@yandex.ru , 120 Mira, +89621988675345 103, Dimon Avackov, ,33/2 Ochakovo, +89621754532312 104, Anna Dimidova , Anna@yandex.ru , 10 Severnaya, +89621512875634 105, Anton Pupkov, 2/B Krasnaya, +89621700453423 andreyex@andreyex:-$
Пример 2. Чтение CSV-файла с использованием заглавных букв в заголовке
Первая строка файла «customers.csv» содержит заголовок файла. Создайте файл Bash со следующим сценарием, который печатает содержимое файла «customers.csv» после заглавной буквы в первой строке файла. Команда awk используется в скрипте для печати содержимого файла после написания заголовка с заглавной буквы. Запятая (,) назначается в значениях FS и OFS в сценарии для чтения файла «customers.csv» и записи файла «updatedcustomers.csv». Команда cat используется для печати содержимого обоих файлов.
printf "Оригинал файла:\n" #Распечатайте исходное содержимое CSV-файла cat cstomers.csv #Создайте новый CSV-файл после ввода заголовка с заглавной буквы awk 'BEGIN{FS=",";OFS=","} { if(NR==1) print toupper($0) else print }' customers.csv > updatedcustomers.csv printf "\nModified File:\n" #Распечатайте новый CSV-файл cat updatedcustomers.csv
После выполнения скрипта появляется следующий вывод:
andreyex@andreyex:-$ bash readcsv2.bash Оригинальный файл: ID, имя, электронная почта, адрес, мобильный 101, Andrey Master, Andrey@yandex.ru , 9/A Krasnaya, +89621762341425 102, Alex Murphy, Alex@yandex.ru , 120 Mira, +89621988675345 103, Dimon Avackov, ,33/2 Ochakovo, +89621754532312 104, Anna Dimidova , Anna@yandex.ru , 10 Severnaya, +89621512875634 105, Anton Pupkov, , 2/B Krasnaya, +89621700453423 Modified File: ID, NAME, EMAIL, ADDRESS, MOBILE 101, Andrey Master, Andrey@yandex.ru , 9/A Krasnaya, +89621762341425 102, Alex Murphy, Alex@yandex.ru , 120 Mira, +89621988675345 103, Dimon Avackov, ,33/2 Ochakovo, +89621754532312 104, Anna Dimidova , f Anna@yandex.ru , 10 Severnaya, +89621512875634 105, Anton Pupkov, , 2/B Krasnaya, +89621700453423 andreyex@andreyex:-$
Пример 3. Замените пустое поле CSV-файла на «No».
Создайте файл Bash со следующим сценарием, который печатает содержимое файла «customers.csv» после изменения пустого поля со значением «No». В этом файле пусты два поля, о которых говорится ниже. Команда «awk» используется в сценарии для печати содержимого файла после изменения пустых полей. Запятая (,) назначается в значениях FS и OFS в сценарии для чтения файла «customers.csv» и записи файла «updatedcustomers.csv». Команда «cat» используется для печати содержимого обоих файлов в табличном формате.
printf "Оригинал файла:\n" #Распечатайте исходное содержимое CSV-файла в табличной форме cat customers.csv | column -s, -t awk 'BEGIN{FS=",";OFS=","} { for(field=1;field<=NF;field++) { if($field == "") $field="None" } print }' customers.csv > modifiedcustomers2.csv printf "\nИзмененный файл:\n" #Распечатайте новый CSV-файл в табличной форме cat modifiedcustomers2.csv | column -s, -t
После выполнения скрипта появляется следующий вывод:
andreyex@andreyex: -$ bash readcsv3.bash Оригинальный файл: ID Name 101 Andrey Master 102 Alex Murphy Email Andrey@yandex.ru Alex@yandex.ru Address 9/A Krasnaya 120 Mira Mobile +89621762341425 +89621988675345 103 Dimon Avackov 104 Anna Dimidova 105 Anton Pupkov 33/2 Ochakovo Anna@yandex.ru 10 Severnaya 2/B Krasnaya +89621754532312 +89621512875634 +89621700453423 Modified File: ID Name 101 Andrey Master 102 Alex Murphy 104 Anna Dimidova 105 Anton Pupkov Email 103 Dimon Avackov None Andrey@yandex.ru Alex@yandex.ru Anna@yandex.ru None Address 9/A Krasnaya 120 Mira 33/2 Ochakovo 10 Severnaya 2/B Krasnaya Mobile +89621762341425 +89621988675345 +89621754532312 +89621512875634 +89621700453423 andreyex@andreyex: -$
Пример 4. Распечатайте общее количество строк и столбцов CSV-файла
Создайте файл Bash со следующим сценарием, который подсчитывает общее количество строк и столбцов в файле «customers.csv». Переменная NR используется для печати общего количества строк файла. Переменная NF используется для печати общего количества полей файла.
printf "Оригинал файла:\n" #Распечатайте исходное содержимое CSV-файла cat customers.csv echo echo -n "Общее количество строк:" awk -F, 'END{print NR}' customers.csv echo -n "Общее количество столбцов:" awk -F, 'END{print NF}' customers.csv
Следующий вывод появляется после выполнения скрипта. Всего строк в файле 6, а всего полей файла 5, которые выводятся на выходе:
andreyex@andreyex:-$ bash readcsv4.bash Оригинальный файл: ID, имя, электронная почта, адрес, мобильный 101, Andrey Master, Andrey@yandex.ru , 9/A Krasnaya, +89621762341425 102, Alex Murphy, Alex@yandex.ru , 120 Mira, +89621988675345 103, Dimon Avackov,33/2 Ochakovo, +89621754532312 104, Anna Dimidova, Anna@yandex.ru , 10 Severnaya, +89621512875634 105, Anton Pupkov,, 2/B Krasnaya, +89621700453423 Общее количество строк:6 Общее количество столбцов:5 andreyex@andreyex:-$
Заключение
В этой статье показаны методы чтения CSV-файла, изменения CSV-файла и подсчета строк и столбцов CSV-файла с помощью сценария Bash.