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として再保存できます。