AWK를 사용하여 이전 값을 기반으로 HTML 테이블(행/열)을 채우려고 합니다. 엑셀과 유사합니다.
예를 들어:
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로 다시 저장할 수 있습니다.