Изменение разделителя csv-файлов в unix

Изменение разделителя csv-файлов в unix

09.10.2013 03:54:48 Просмотров 26 Источник

У меня их несколько .csv файлы с разделителем табуляции, и теперь я хочу изменить разделитель. Когда я использую приведенный ниже скрипт, он не изменяет файл. Пожалуйста, помогите мне со сценарием.

file_mask=$1
from_delim=$2
to_delim=$3
for i in `ls $file_mask*`
do
sed -i 's|$from_delim|$to_delim|g' $i
done
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/19271316/change-csv-file-delimiter-in-unix#comment28531540_19271316
я также использовал двойные кавычки, и у меня не было никаких ошибок.

Ответы - Изменение разделителя csv-файлов в unix / Change csv file delimiter in unix

devnull

09.10.2013 03:58:27

Вы можете использовать tr:

tr '\t' ',' < inputfile > outfile

(предполагая, что это новый разделитель)

Является ответом!
glenn jackman

09.10.2013 03:58:38

Вам нужно использовать двойные кавычки для тела sed, чтобы переменные оболочки могли быть расширены:

sed -i "s|$from_delim|$to_delim|g" $i

Лучше надеяться, что ни $from_delim, ни $to_delim не содержат трубы.

Кроме того, не разбирайте ls - вам вообще не нужен цикл for:

sed -i "s|$from_delim|$to_delim|g" ${file_mask}*

проверка различий:

file_mask=$1
from_delim=$2
to_delim=$3

sed -i.bak "s|$from_delim|$to_delim|g" $file_mask*

for f in $file_mask*; do
    diff -q $f $f.bak >/dev/null
    if (( $? != 1 )); then
        echo "no changes made to $f"
    fi
done
https://stackoverflow.com/questions/19271316/change-csv-file-delimiter-in-unix/19271397#comment28532740_19271397
Спасибо @Гленн Джекман. это работает. но у меня есть сомнения, когда я использую этот sed-i 's|\t|^|g' он изменяет файлы. почему не в петле?
https://stackoverflow.com/questions/19271316/change-csv-file-delimiter-in-unix/19271397#comment28533263_19271397
Вам не нужен цикл, потому что если вы даете sed -i, он будет редактировать каждый из них по очереди: sed сам по себе зацикливается на файлах.
https://stackoverflow.com/questions/19271316/change-csv-file-delimiter-in-unix/19271397#comment28533440_19271397
Окей. после изменения файлов, я хочу сделать сканирование, а также ли файл изменен или нет. так что я очень уверен и в количестве измененных файлов. вы можете помочь мне, как я должен использовать, если условие.
https://stackoverflow.com/questions/19271316/change-csv-file-delimiter-in-unix/19271397#comment70385260_19271397
Если разделитель заключен в кавычки внутри поля, простого sedили trбудет недостаточно. Вы должны иметь сбалансированные цитаты вы все еще можете использовать sed, но это становится громоздким: unix.stackexchange.com/questions/48672 / ... лучше использовать csvtool напр.
Anne van Rossum

11.01.2017 03:34:24

Не используйте sedдля этого sed или tr, используйте tr(доступный из общих репозиториев). Если у вас есть вкладки в строках, то вышеописанные простые инструменты будут подавляться. Вам нужно будет использовать csvtool, чтобы начать подсчет котировок и т. д. С этими основными инструментами будет полный бардак.

Заменить вкладки, например, полуколоннами с csvtool, включая все угловые случаи, просто.:

awk

С csvtool -t TAB -u ';' cat $ifile -o $ofile входной файл и $ifileвыходной файл.

VIET THANG VU

25.11.2019 06:22:15

Я рекомендую использовать csvkit: https://csvkit.readthedocs.io/en/latest/. с помощью csvformat, который поставляется вместе с пакетом, вы можете безопасно изменить разделитель.

csvformat -D '[your delimiter here]' [file name]
Закрыть X