基于CSV的Bash脚本下载PDF后无法打开,求助排查解决
批量下载PDF无法打开问题排查与解决
问题概述
参考同类脚本从含名称、URL的CSV批量下载PDF,单独执行wget命令可正常获取有效PDF,但脚本下载的文件均无法被阅读器打开,CSV内的URL本身是有效的。
现有脚本
原脚本
downloadPDF() { LINECOUNTER=0 while IFS=, read -r field1 field2 do LINECOUNTER=$[$LINECOUNTER +1] if [ "$field1" == "" ] then echo "Line $LINECOUNTER: field1 is empty or no value set" elif [ "$field2" == "" ] then echo "Line $LINECOUNTER: field2 is empty or no value set" else pdf_file=$(echo "$field1" | tr '/' ' ') echo "=================================================" echo "Downloading $LINECOUNTER: $pdf_file..." echo "=================================================" pdf_file_saveas="$pdf_file.pdf" FILECOUNTER=0 while [ -e "$pdf_file_saveas" ] do FILECOUNTER=$[$FILECOUNTER +1] pdf_file_saveas="$pdf_file.$FILECOUNTER.pdf" done if [ $FILECOUNTER -gt 0 ] then echo -e "\033[32m ^^^ File already exists!!! Adding number at the end of the file: $pdf_file_saveas \033[0m" >&2 fi wget -q -nc -O "$pdf_file_saveas" "$field2" fi done < ./data_duplicates_removed.csv }
简化后脚本
downloadPDFMod() { LINECOUNTER=0 while IFS=, read -r field1 field2 do LINECOUNTER=$[$LINECOUNTER +1] pdf_file=$(echo "$field1" | tr '/' ' ') pdf_file_saveas="$pdf_file.pdf" wget -q -nc -O "$pdf_file_saveas" "$field2" done < ./data_clean.csv }
CSV格式示例
每行包含4个字段,示例如下:
New_Name, URL, MFG, MPN ROHS_MFG_MPN, http://download.siliconexpert.com/pdfs/..../acrobatdocument.pdf, MFG, MPN ROHS_Manufacturer_Name_Manufacturer_Part_Number_123, http://download.siliconexpert.com/pdfs2.../manual/acrobatdocument-ec2.pdf, Manufacturer_Name, Manufacturer_Part_Number_123
核心原因
- 字段读取错误:脚本用
IFS=, read -r field1 field2读取CSV时,会将每行第二个逗号后的所有内容(包括MFG、MPN字段)全部归入field2,导致实际请求的URL是http://xxx, MFG, MPN这种无效地址。 - URL含多余空格:CSV中URL字段前存在空格,未清理的话会导致wget请求带空格的错误URL。
- wget静默模式隐藏错误:
-q参数会屏蔽所有错误信息,无法及时发现URL无效的问题。
修复方案
步骤1:修正字段读取逻辑
修改read命令,明确忽略后续的MFG、MPN字段,避免URL被污染:
# 用_吸收多余字段,确保field2仅为URL IFS=, read -r field1 field2 _ _
步骤2:清理URL中的空格
去除URL前后的多余空格,保证请求地址正确:
field2=$(echo "$field2" | xargs)
步骤3:关闭wget静默模式
去掉-q并添加-v参数,实时查看下载日志,方便排查问题:
wget -nc -O "$pdf_file_saveas" "$field2" -v
修复后的完整简化脚本
downloadPDFMod() { LINECOUNTER=0 while IFS=, read -r field1 field2 _ _ do LINECOUNTER=$((LINECOUNTER +1)) # 清理文件名中的斜杠 pdf_file=$(echo "$field1" | tr '/' ' ') # 清理URL前后的空格 field2=$(echo "$field2" | xargs) pdf_file_saveas="$pdf_file.pdf" # 开启日志输出,便于排查 wget -nc -O "$pdf_file_saveas" "$field2" -v done < ./data_clean.csv }
更可靠的awk替代方案
如果CSV结构复杂(比如字段含逗号),用awk处理更稳妥:
awk -F ',' 'NR>1 { # 跳过表头行 name = $1 url = $2 # 清理字段前后的空格 gsub(/^[ \t]+|[ \t]+$/, "", name) gsub(/^[ \t]+|[ \t]+$/, "", url) # 替换文件名中的斜杠为空格 gsub(/\//, " ", name) saveas = name ".pdf" # 构造并执行wget命令 cmd = "wget -nc -O \"" saveas "\" \"" url "\" -v" system(cmd) }' ./data_clean.csv
内容的提问来源于stack exchange,提问作者dabean
相关产品推荐
相关产品推荐

