Вопрос, к сожалению, не дает достаточно подробностей, чтобы точно определить, в чем именно заключаются проблемы;но мы определили в комментариях по крайней мере следующее.
- По-видимому, входной файл содержит возврат каретки 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
где-то в конвейере.