You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

核心原因

  1. 字段读取错误:脚本用IFS=, read -r field1 field2读取CSV时,会将每行第二个逗号后的所有内容(包括MFG、MPN字段)全部归入field2,导致实际请求的URL是http://xxx, MFG, MPN这种无效地址。
  2. URL含多余空格:CSV中URL字段前存在空格,未清理的话会导致wget请求带空格的错误URL。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:54:23