2014-10-02 2 views
1

Я извлекаю данные из файла CSV, экспортированного из excel.Обрезка нового символа строки из строки в bash

CSV-файл выглядит следующим образом:

Category,Feature,Description,app1,app2,app3,app4,app5,app6,app7 
Employee Relations,Employee Management,,y,y,n,y,y,y,n 
Employee Relations,Employee Availability,,y,y,n,n,y,y,n 

проблема конец подача характер линия становится на пути. принять следующий код:

title=$(head -n 1 $1) # grab the first row 
title=`echo $title | sed -e 's/^ *//' -e 's/ *$//'` # me trying to fix. I think this is the issue 
echo $title #this seems to look right 
IFS=',' read -a titline <<<"$title" # make it an array 

for ((i = 0 ; i < ${#titline[@]} ; i++)) do 
    echo "[[${titline[$i]}]]" 
done 

распечатывает:

Category,Feature,Description,app1,app2,app3,app4,app5,app6,app7 
[[Category]] 
[[Feature]] 
[[Description]] 
[[app1]] 
[[app2]] 
[[app3]] 
[[app4]] 
[[app5]] 
[[app6]] 
]]app7 

, как вы можете видеть, что последняя строка должна быть:

[[app7]] 

и это завинчивание с остальной частью сценария.
Я не уверен, что я делаю неправильно, и могу использовать указатель

+0

что делает ваш скрипт делать? ваша конечная цель? Я чувствую, что awk будет лучшим способом справиться с csv. – Kent

ответ

2

Проблема в том, что ваш файл csv имеет окончания строки DOS.

Я скопировать и вставить свои данные и сценарий, и выдает результат:

Category,Feature,Description,app1,app2,app3,app4,app5,app6,app7 
[[Category]] 
[[Feature]] 
[[Description]] 
[[app1]] 
[[app2]] 
[[app3]] 
[[app4]] 
[[app5]] 
[[app6]] 
[[app7]] 

конвертировал файл CSV для DOS строки окончаний и получил тот же самый вопрос, который вы видели.

Решение должно использовать dos2unix или аналогичную утилиту, чтобы исправить файл, прежде чем вы его прочитали. Это может быть сделано следующим образом:

title=$(dos2unix <"$1" | head -n 1) # grab the first row 
echo $title 
IFS=',' read -a titline <<<"$title" # make it an array 
for ((i = 0 ; i < ${#titline[@]} ; i++)) do 
    echo "[[${titline[$i]}]]" 
done 

Или, вы можете использовать sed:

title=$(head -n 1 "$1" | sed 's/\r//') # grab the first row 
echo $title 
IFS=',' read -a titline <<<"$title" # make it an array 
for ((i = 0 ; i < ${#titline[@]} ; i++)) do 
    echo "[[${titline[$i]}]]" 
done 
Смежные вопросы