有一个上传过程,读取文件并使用 sqlldr 将数据上传到数据库。我在 sqlldr 中处理文件时遇到无效号码问题。发现文件是UTF-16格式,然后在notepad++中转换为UTF-8格式,它开始正常工作。现在我正在尝试系统地转换它,如下所示。
iconv -f UTF-16 -t UTF-8 file_name >output_file_name
Run Code Online (Sandbox Code Playgroud)
该文件可能具有不同的编码,因此我想在转换之前找到该文件的编码,然后根据该编码进行转换。例如使用 file 命令仅从下面读取 UTF-16,然后在 -f 选项中使用它。
bash-4.2$ file "/FILE_UPLOADS/Relationship (4).txt"
/FILE_UPLOADS/Relationship (4).txt: Little-endian UTF-16 Unicode text, with CRLF line terminators
Run Code Online (Sandbox Code Playgroud)
我怎么做?
管道 (|) 限制文本文件从 Windows 应用程序传输以进行处理。处理时,文件第一行的第一列中有一个特殊字符。\n这是从 Windows 传输之前文件在记事本中的外观
\nSector|Name|Manager|...\n
Run Code Online (Sandbox Code Playgroud)\n当我读取时IFS='|' read -r -a fields < "/uploads/file_data.txt"
,第一列扇区被读取为"\xc3\xaf\xc2\xbb\xc2\xbfSector"
带有特殊字符前缀。
当我这样做时,head -1 "/uploads/file_data.txt" | od -c
打印的值是
0000000 357 273 277 S e c t o r |\n
Run Code Online (Sandbox Code Playgroud)\n我尝试过tr -d < //uploads/file_data.txt > /uploads/file_data_temp.txt
但没有帮助。如果将来上传的文件中有任何未知字符,我该如何替换特殊字符?
尝试从文件中读取第 n 行并根据分隔符拆分为数组
HEAD_START=4
IFS='|' read -r -a headers < sed "${HEAD_START}q;d" "/FILE_UPLOADS/Checklist-Relationship (4).txt"
Run Code Online (Sandbox Code Playgroud)
上面给出"sed: cannot open [No such file or directory]"
但是当我sed "${HEAD_START}q;d" "/FILE_UPLOADS/Checklist-Relationship (4).txt"
在提示符下运行时它工作正常