
労働関係法違反リストをcsvにしてみた。
厚生労働省が公開した「労働基準関係法令違反に係る公表事案」のPDFからテーブルデータを抜き出してcsv化してみましたた。
update: 2017/9/15
170510-01.csv
pdf-table-extractを使ってサクッとできそう! とか思っていたのですが、セル内に改行や全角・半角空白が混じっているとうまくパースできないらしいです。
仕方がないので、一部強引な方法で整形しました。
[追記]
公開されているpdf、ちゃんと毎月更新されているんだけど、ファイル名が170510-01.pdfのまま追記されていく形式なのでわかりずらい。
サンプルコード
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | const pdf_table_extractor = require("pdf-table-extractor") const d3 = require("d3-dsv")  const fileName = process.argv[2] || null const shaping = (json) => {     const head = json.pageTables[0].tables[0]     const pageTables = json.pageTables.map( page => page.tables.filter((tr,i) => i > 0) )     const flattenTable = Array.prototype.concat.apply([], pageTables)     const deletedLF = flattenTable.map( tr => tr.map(td => td.replace(/\n/g, "")) )     const cleand = deletedLF.map((tr => {         if (tr[1]==="" && tr[2]==="" && tr[3] ==""){             let split = tr[0].split(/\s/).filter(s => s !== "" )             if(split.length > 4){                 split[0] += split[1]                 delete split[1]                 let tmp = split.filter(s => s !== null)                 split = tmp             }             tr[0] = split[0]             tr[1] = split[1]             tr[2] = split[2]             tr[3] = split[3]         }         else if (tr[1]==="" && tr[2]===""){             let split = tr[0].split(/\s/).filter(s => s !== "" )             if(split.length > 3){                 split[0] += split[1]                 delete split[1]                 let tmp = split.filter(s => s !== null)                 split = tmp             }             tr[0] = split[0]             tr[1] = split[1]             tr[2] = split[2]         }         else if (tr[2]==="" && tr[3]===""){             let split = tr[1].split(/\s/).filter(s => s !== "" )             if(split.length > 3){                 split[0] += split[1]                 delete split[1]                 let tmp = split.filter(s => s !== null)                 split = tmp             }             tr[1] = split[0]             tr[2] = split[1]             tr[3] = split[2]         }         else if (tr[2]==""){             let split = tr[1].split(/\s/).filter(s => s !== "" )             tr[1] = split[0]             tr[2] = split[1]                 }         else  if (tr[3] ==""){             let split = tr[2].split(/\s/).filter(s => s !== "" )             tr[2] = split[0]             tr[3] = split[1]                 }         return tr     }))     const result = cleand.map(d => {         let obj = {}         head.forEach((key,i) => {             obj[key] = d[i]         })         return obj     })     return result } const success = (result) => {     const json = shaping(result)         const csv = d3.csvFormat(json)     console.log('\ufeff'+csv) } const error = (err) => {    console.error('Error: ' + err) } if(!fileName){     console.log("ファイル名を指定してください") }else{     pdf_table_extractor(fileName,success,error)     } | 
実行
| 1 | $ node convert.js 170510-01.pdf > 170510-01.csv |