Chuyển đổi bảng csv sang HTML


8

Tôi có một Medical.csvtệp với các hàng có định dạng sau,

    field: 'participation.type', displayName: 'program_type', type: 'String',path:'participation'
    field: 'participation.program', displayName: 'program_name', type: 'String',path:'participation'

Tôi muốn viết một kịch bản bash để chuyển nó sang bảng HTML với field, displayNametypenhư tiêu đề tự động.

Các Csv2HtmlConverter.sh(Lấy cảm hứng từ câu trả lời tại Chuyển đổi csv để bảng html sử dụng ) được

    echo "<table>" ;
    while read INPUT ; do
            echo "<tr><td>${INPUT//,/</td><td>}</td></tr>" ;
    done < Medical.csv ;
    echo "</table>"

Kết quả cho kịch bản trên là như dưới đây là tốt ở một mức độ nào đó nhưng tôi muốn thêm <th>field</th>, một <th>displayName</th>cách linh hoạt.

<table>
<tr><td>field: 'participation.type'</td><td> displayName: 'program_type'</td><td> type: 'String'</td><td>path:'participation'</td></tr>
<tr><td>field: 'participation.program'</td><td> displayName: 'program_name'</td><td> type: 'String'</td><td>path:'participation'</td></tr>
</table>

Câu trả lời:


12

Điều này sẽ thực hiện các mẹo:

echo "<table>" ;
print_header=true
while read INPUT ; do
  if $print_header;then
    echo "<tr><th>$INPUT" | sed -e 's/:[^,]*\(,\|$\)/<\/th><th>/g'
    print_header=false
  fi
  echo "<tr><td>${INPUT//,/</td><td>}</td></tr>" ;
done < Medical.csv ;
echo "</table>"

Giải thích về regex được sử dụng là sed:

:[^,]*(,|$)

Hình dung biểu thức thường xuyên

Điều này sẽ khớp : 'participation.type',:'participation'\n( $có nghĩa là kết thúc đầu vào / dòng trong regex).


Hoạt động hoàn hảo theo yêu cầu của tôi. Sự tôn trọng.
nguyện

1
Hình ảnh lịch sự của debuggex.com
Stéphane Chazelas

0

Đây là tập lệnh shell sẽ chuyển đổi CSV sang HTML:

http://giantdork.org/alain/bash-and-awk-to-convert-deliated-data-csv-tsv-etc-to-html-tables/

Để giải quyết trường hợp sử dụng của bạn cụ thể.

Giả sử CSV gốc sau:

$ cat original.csv 
field: 'participation.type', displayName: 'program_type', type: 'String',path:'participation'
field: 'participation.program', displayName: 'program_name', type: 'String',path:'participation'

Bạn có thể muốn sửa đổi nó một chút:

$ echo field,displayName > modified.csv
$ awk -F"'" 'OFS="," {print$2,$4}' original.csv >> modified.csv

Để sản xuất phiên bản đã dọn sạch sau đây:

$ cat modified.csv 
field,displayName
participation.type,program_type
participation.program,program_name

Sau đó, chạy tập lệnh được liên kết trước đó trên CSV gốc, sẽ tạo ra HTML sau:

$ csv2htm.sh --head original.csv 
  <table>
    <thead>
      <tr>
        <th>field: 'participation.type'</th>
        <th> displayName: 'program_type'</th>
        <th> type: 'String'</th>
        <th>path:'participation'</th>
      </tr>
    </thead>
      <tr>
        <td>field: 'participation.program'</td>
        <td> displayName: 'program_name'</td>
        <td> type: 'String'</td>
        <td>path:'participation'</td>
      </tr>
  </table>

Chạy nó trên CSV đã được dọn sạch, sẽ tạo ra:

$ csv2htm.sh --head modified.csv
  <table>
    <thead>
      <tr>
        <th>field</th>
        <th>displayName</th>
      </tr>
    </thead>
      <tr>
        <td>participation.type</td>
        <td>program_type</td>
      </tr>
      <tr>
        <td>participation.program</td>
        <td>program_name</td>
      </tr>
  </table>

1
Kịch bản, thoạt nhìn, dường như không xử lý nội dung ô được trích dẫn (thậm chí có thể kéo dài nhiều dòng).
Anthon

Phải, không. Chắc chắn có thể thêm xử lý ô được trích dẫn hoặc chỉ tiền xử lý với một cái gì đó như:sed 's/"//g' input
Alain Kelder

Hoặc, nếu dữ liệu cũng chứa dấu ngoặc kép:sed 's/^"//;s/"$//;s/","/,/g;' input.csv
Alain Kelder

0
host=`hostname`
now=`date +"%d-%b-%y"`
now=`echo $now| tr '[a-z]' '[A-Z]'`
yest=`TZ=CST+24 date +%d-%b-%y`
yest=`echo $yest| tr '[a-z]' '[A-Z]'`
sub="Jobs-$host-$now-HealthReport"

if [ -s jobs.csv ]
then
awk 'BEGIN{
FS=","
print "<HTML>""<TABLE border=1 width='100%' align='centre' ><tr bgcolor='#000080'><TH><FONT COLOR='#FFFFFF'>HSCR-DBMSJOB HEALTH REPORT  </TH></FONT>"
print "</TABLE>"
print "<HTML>""<TABLE border=1 width='100%' align='centre' bgcolor='#C6C6C6' BORDERCOLOR='#CCFF00' ><tr bgcolor='#5F9EA0'><TH>SUMMARY</TH>"
print "</TABLE>"
print "<HTML><TABLE border=2 width='100%' align='centre' BORDERCOLOR='#330000' ><trbgcolor='#FFFFCC'>"

print "<TH>BROKEN</TH><TH>SCHEMA_USER</TH><TH>JOB_ID</TH><TH>LAST_DATE</TH><TH>LAST_SEC</TH><TH>THIS_DATE</TH>"
print "<TH>THIS_SEC</TH><TH>NEXT_DATE</TH><TH>NEXT_SEC</TH><TH>NAME</TH>"
}


{
    printf "<TR>"
            for(i=1;i<=10;i++){

                      if(i == 1 && $i == "N" || i == 4 && $i == n || i == 4 && $i == y )
                    {
                            printf "<TD bgcolor='#75923C'>%s</TD>", $i
                    }
                    else if(i == 1 && $i == "Y" || i == 4 && $i != n && $i != y)
                    {
                            printf "<TD bgcolor='#FF0000'>%s</TD>", $i
                    }
                    else
{
                            printf "<TD>%s</TD>", $i
}
            }
            print "</TR>"
    }

END{

            print "</TABLE></BODY></HTML>"
    }' y="$yest" n="$now" jobs.csv > jobstatus-$host-$now.html
else
echo "file not found"

fi

Bạn có thể vui lòng định dạng lại mã của bạn để dễ đọc hơn. Và thêm một số ý kiến ​​...
Romeo Ninov

0

Tôi biết đó là một câu trả lời muộn cho câu hỏi này, nhưng sẽ giúp những người đó tìm kiếm giải pháp, để chuyển đổi đầu ra lệnh bash sang định dạng bảng html. Có một kịch bản dễ dàng có sẵn để làm điều này tại: https://sourceforge.net/projects/command-output-to-html-table/ có thể được sử dụng để chuyển đổi bất kỳ đầu ra lệnh hoặc tệp nào sang định dạng bảng html đẹp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.