【问题标题】:Script to iterate through html file and create csv file用于遍历 html 文件并创建 csv 文件的脚本
【发布时间】:2016-03-13 05:11:57
【问题描述】:

我有一个 html 文件,其中包含我正在处理的项目的依赖项列表。格式如下:

-- 一些html

  <p><strong>Module Name:</strong> spring-web</p>
   <p><strong>Module Group:</strong> org.springframework</p>
   <p><strong>Module Version:</strong> 4.2.1.RELEASE</p>

-- 更多html

 <p><strong>Module Name:</strong> google-http-client</p>
    <p><strong>Module Group:</strong> com.google.http-client</p>
    <p><strong>Module Version:</strong> 1.19.0</p>

我想从这个 html 文件创建一个 csv 文件 csv 文件将具有每条记录的格式:

模块名称、模块组、模块版本

例如 google-http-client,com.google.http-client,1.19.0

知道如何用脚本做到这一点吗?

【问题讨论】:

  • 使用 XML 解析器(xmlstarlet, xmllint, ...)。

标签: html bash csv unix scripting


【解决方案1】:

试一试!

#!/bin/bash
inFile=$1
outFile=$2

join () {
 local del=$1
 shift
 IFS="$del"
 source <(
        cat <<SOURCE
 echo "\${$1[*]}"
SOURCE
 ) 
 unset IFS
}

declare -a CSV=('"Module Name","Module Group","Module Version"')
declare -a keysAccepted=('Name' 'Group' 'Version')

declare -i nMandatoryKeys=${#keysAccepted[@]}
declare -A KeyFilled
rxKeysAccepted='('$(join '|' keysAccepted)')'
while read line; do
        [[ $line =~ \<strong\>Module\ $rxKeysAccepted:\</strong\>[[:space:]]*([^<]+)\</p\> ]] || continue
        key=${BASH_REMATCH[1]}
        val=${BASH_REMATCH[2]}
        KeyFilled[$key]=$val
        if (( ${#KeyFilled[@]} == nMandatoryKeys )); then
                unset csvLine
                for k in ${keysAccepted[@]}; do
                        csvLine+=${csvLine:+,}${KeyFilled[$k]}
                done
                KeyFilled=()
                CSV+=($csvLine)
        fi
done <"$inFile"

(( ${#CSV[@]} > 1 )) || exit 1

join $'\x0a' CSV >"$outFile"

【讨论】:

  • 第 2 行:声明:-A:无效选项声明:用法:声明 [-afFirtx] [-p] [name[=value] ...]
  • 此代码适用于 BASH 4(4 是主要版本号),但此版本的 BASH 是我所知道的所有现代 *nix'es 的默认设置...
  • 谢谢,我如何将我的文件作为参数传递而不必在 'EOHTML' 之后复制它。
  • 如果我想在每一行添加另一列,例如执照。

    许可证:Apache

    。我应该在哪里添加这个模式匹配?
  • 修改:“declare -a CSV”(添加新列的标题),“declare -a keysAccepted” - 添加新列名称,“[[ $line =~ ...” - 替换正则表达式:\Module\ $rxKeysAccepted:\\>([[:space:]]*([^|

    [[:space: ]]*([^) 使用 ${BASH_REMATCH[2]} 代替 ${BASH_REMATCH[1]}

【解决方案2】:

如果您的源文件是一致的(所有三个字段以相同的顺序同时存在),您可以试试这个...

$ sed -nr 's_\s*<p><strong>Module (Name|Group|Version):</strong> (.*)</p>_\2_p' file\
  | awk 'ORS=NR%3?",":RS'
spring-web,org.springframework,4.2.1.RELEASE
google-http-client,com.google.http-client,1.19.0

【讨论】:

    猜你喜欢
    • 2016-10-30
    • 2019-09-29
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    相关资源
    最近更新 更多