![](https://gunmagisgeek.com/blog/wp-content/uploads/2017/05/black-e1494833539141.png)
労働関係法違反リストを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 |