Конвертируйте много txt файлов в xls файлы с помощью скрипта bash - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь преобразовать много текстовых файлов в файлы xls.Стиль txt-файла следующий:

"Name";"Login";"Role"
"Max Muster";"Bla102";"user"
"Heidi Held";"Held100";"admin"

Я пытался работать с этим сценарием bash:

for file in *.txt; do
      tr ";" "," < "$file" | paste -d, <(seq 1 $(wc < "$file")) - > "${file%.*}.xls"
      soffice --headless --convert-to xls:"MS Excel 95" filename.xls "${file%.*}.xls"
done

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

攀挀琀 |  Max Muster |  Bla102   |  user
氀愀猀 |  Heidi Held |  Held100  |  admin

Как мне избавиться от этих китайских знаков и сохранить строку заголовка?

1 Ответ

0 голосов
/ 20 ноября 2018

Вопрос, к сожалению, не дает достаточно подробностей, чтобы точно определить, в чем именно заключаются проблемы;но мы определили в комментариях по крайней мере следующее.

  • По-видимому, входной файл содержит возврат каретки DOS.
  • По-видимому, soffice попытался прочитать файл какUTF-16 , это то, что произвело практически случайные китайские иероглифы.(Символы могут быть любыми; просто более вероятно, что случайный символ Unicode BMP будет в китайском / японском блоке.)

С этими наблюдениями и рефакторингом существующего сценария попробуйте

for file in *.txt; do
    awk -F ';' 'BEGIN { OFS="," }
        FNR==1 {
            # Add UTF-8 BOM
            printf "\357\273\277"
            # Generate header line for soffice to discard
            for (i=1; i<=NF; i++) printf "bogus%s", (i==NF ? "\n" : OFS)
        }
        { sub(/\015/, ""); print FNR, $0 }' "$file" > "${file%.*}.xls"
    soffice --headless --convert-to xls:"MS Excel 95" filename.xls "${file%.*}.xls"
done

Во многих словах скрипт Awk разделяет каждую строку ввода на точки с запятой (-F ';') и устанавливает разделитель поля вывода OFS на запятую.В первой строке вывода мы добавляем спецификацию и строку синтетического заголовка для soffice, которую нужно отбросить до реального вывода, чтобы строка заголовка отображалась как обычная строка данных в выводе.sub позаботится об удалении любого символа возврата каретки DOS, а переменная FNR - это номер строки текущей входной строки.

Я не уверен, строго ли необходимы спецификация или фиктивная строка заголовка или, возможно, вам нужно передать некоторые дополнительные параметры, чтобы soffice обрабатывал ввод как правильный UTF-8.Возможно, вам также нужно включить LC_ALL=C где-то в конвейере.

...