使用 AWK,我尝试根据先前的值填充 HTML 表(行/列)。类似于Excel。
例如:
table
user$ csv2html.awk table.csv
rowing | fast | good
| fast | good
swim | |
| | slow
| | increase
| late |
golf | red | bad
我希望这个 html 表变成以下内容:
table
rowing | fast | good
rowing | fast | good
swim | fast | good
swim | fast | slow
swim | fast | increase
swim | late | increase
golf | red | bad
该表可以有任意数量的列/行,并且值可以根据许多不同的单词而变化。我只是想了解如何解析 html,然后填写我在每列/行中找到的值。
输出必须是保持格式的新 html 文件。
更新:
<html><body><table>
<tr>
<th>Column1</th>
<th>Column2</th>
<th>Column3</th>
</tr>
<tr>
<td>rowing</td>
<td>fast</td>
<td>good</td>
</tr>
<tr>
<td></td>
<td>fast</td>
<td>good</td>
</tr>
<tr>
<td>swim</td>
<td></td>
<td></td>
</tr>
</table></body></html>
答案1
您需要在awk
脚本中添加类似这样的内容:
for(i=1;i<=NF;i++){
if($i==""){$i=last[i]}
last[i]=$i
}
由于您不向我们展示您的脚本,因此您必须自己完成。
从结果表开始,它可能如下所示:
$ awk -F ' *\| *' '
BEGIN{OFS="|"}
{
for(i=1;i<=NF;i++){
if($i==""){$i=last[i]}
last[i]=$i
}$1=$1
}1' table
rowing|fast|good
rowing|fast|good
swim|fast|good
swim|fast|slow
swim|fast|increase
swim|late|increase
golf|red|bad
然而!我想你用一个合适的 html 解析器而不是awk
.我可以推荐python
的beautifulsoup
模块。
或者甚至更好,使用适当的数据分析工具,例如pandas
,它通过其ffill
方法:
ffill
:将最后一个有效观察向前传播到下一个有效观察
#!/usr/bin/env python3
import pandas as pd
with open('file.html') as f:
html = f.read()
df = pd.read_html(html)[0]
df = df.ffill()
df.head()
输出:
Column1 Column2 Column3
0 rowing fast good
1 rowing fast good
2 swim fast good
看这里。
答案2
虽然 @pLumo 已经解决了这个问题,但出于某种原因,多字符正则FS
表达式与我的版本gawk
(5.1.0) 不能很好地配合,因此需要另一种方法来清理空白......
awk -F'\|' 'BEGIN{OFS="<\\td>\n<td>"; ORS="<\\td>\n<\\tr>\n"}
{for (i=1; i<=NF; i++) {
gsub(/^[ \t]+|[ \t]+$/, "", $i); $i=(!$i)?last[i]:$i; last[i]=$i
} printf "<tr>\n<td>"}1' file
<tr>
<td>rowing<\td>
<td>fast<\td>
<td>good<\td>
<\tr>
<tr>
<td>rowing<\td>
<td>fast<\td>
<td>good<\td>
<\tr>
<tr>
<td>swim<\td>
<td>fast<\td>
<td>good<\td>
<\tr>
<tr>
<td>swim<\td>
<td>fast<\td>
<td>slow<\td>
<\tr>
<tr>
<td>swim<\td>
<td>fast<\td>
<td>increase<\td>
<\tr>
<tr>
<td>swim<\td>
<td>late<\td>
<td>increase<\td>
<\tr>
<tr>
<td>golf<\td>
<td>red<\td>
<td>bad<\td>
<\tr>
答案3
填充 CSV 然后生成 HTML 比先生成 HTML 然后填充 HTML 更简单、更稳健,但是......
$ awk -F'</?td>' 'NF>1{$0=($2=="" ? "<td>"prev"</td>" : $0); prev=$2} 1' file
<html><body><table>
<tr>
<th>Column1</th>
<th>Column2</th>
<th>Column3</th>
</tr>
<tr>
<td>rowing</td>
<td>fast</td>
<td>good</td>
</tr>
<tr>
<td>good</td>
<td>fast</td>
<td>good</td>
</tr>
<tr>
<td>swim</td>
<td>swim</td>
<td>swim</td>
</tr>
</table></body></html>
答案4
如果这是一项不需要编写脚本的一次性任务,您可以将 HTML 表格导入到某些电子表格程序(例如 LibreOffice Calc)中,使用其填充功能,然后将其保存回 HTML。