Как прочитать файл CSV с одним столбцом в bash?

#bash #csv

#bash #csv

Вопрос:

Я относительно новичок в bash / программировании в целом.

У меня есть CSV с одним столбцом, который выглядит следующим образом:

 domain1.com
domain2.com
domain3.com
domain4.com
 

Я хочу просмотреть каждую запись и что-то с ней сделать. Вот мой код:

 foo(){
i=0
  while read -a line; 
    do
      echo ${line[i]}
      ((i  ))
    done < myfile.csv 
}
 

И ничего не происходит. Я понял, что если я изменю файл, на который я указываю, на:

 done< <(grep '' myfile.csv)
 

это будет работать, но только выплюнет самую последнюю строку CSV, например:

 domain4.com 
 

Опять же, я новичок и сам учусь этому, поэтому буду признателен за любые объяснения, которые вы хотите дать в своих ответах!

РЕДАКТИРОВАТЬ Итак, похоже, что моя новая проблема заключается в удалении символа ^M из моего CSV-файла. Как только я выясню, как это сделать, я отмечу здесь ответ, который подходит мне.

Комментарии:

1. Если есть только один столбец, тогда while read -r line; do echo "$line"; done < file.csv тоже будет работать.

2. тот же результат: ничего…

3. Можете ли вы показать вывод head file.csv | cat -vte

4. Я понимаю, что вы просите совета по Bash, но другие инструменты Linux могут лучше подойти для работы с текстовыми файлами построчно. Я бы предложил попробовать awk

5.Попробуйте, echo >> file.csv прежде чем запускать предложенный while мной цикл.

Ответ №1:

Если вы хотите сохранить свои строки в массиве, вы бы просто сделали:

 readarray -t lines < file
 

И, если вы хотите попробовать обработать эти строки, у вас может быть что-то вроде

 for line in "${lines[@]}"; do
    echo "$line"
done
 

Или по индексу (разум ! ):

 for i in "${!lines[@]}"; do
    echo "${lines[i]}"
done
 

Индексы начинаются с 0.

Ответ №2:

 while read p; do
  echo $p
done < myfile.csv
 

Комментарии:

1. Этот пример отвечает на вопрос для ограниченного набора данных, показанного в примере, но завершится ошибкой, если в тексте есть пробелы. Возможно, вы захотите добавить к нему префикс IFS=$'n'

2. @KirkRoybal Хотя вы правы, нужно добавить, что в примере показаны доменные имена, а доменные имена не могут содержать пробелов.

Ответ №3:

Похоже, у вас есть 2 проблемы:

  1. Все ваши строки заканчиваются r
  2. Нет новой строки или r в конце последней строки

Чтобы устранить эту проблему, используйте этот скрипт:

 echo >> file.csv
while read -r line; do echo "$line"; done < <(tr 'r' 'n' < file.csv)
 

Ответ №4:

Вы также можете просто прочитать файл в массив с помощью:

 array=( `<file` )
 

Если вам нужно использовать числовые индексы, то вы можете получить доступ к элементам с помощью:

 for ((i=0;i<${#array[@]};i  ))
    printf " array [-]: %sn" "$i" "${array[$i]}"
done