ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Чтение CSV-файла в Bash

Чтение CSV-файла в Bash

Полная форма 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.

Exit mobile version