2017-08-05 7 views
1

に、私は(JSON CSVファイル内の)次のような構造ではなく、大きなCSVファイルを取得:別のツールについては JSON CSVでのREST APIエンドポイントを通じてCSV

A,B,C,D 
1,2,3,{"E":1,"F":2,"G":3} 
1,2,3,{"E":1,"H":2} 

、私は平らでCSVを必要とします構造体(入れ子にされたJSONはありません)。だから、結局、私はそのように見えるCSVを持っていたいと思います。

A,B,C,E,F,G,H 
1,2,3,1,2,3, 
1,2,3,1,,,2 

(列見出しは、構造化され見えますが、これは私のユースケースのために重要ではありません)

CSVファイルはかなり大きいです、私はそうする比較的パフォーマンスの方法を探しています。私はこれをJavaScript(Node.JS)で書いています(それはスクリプトの他のすべての部分で使用されている言語なので)。しかし、今のところ、私は理論的な方法を探しています/実行可能な問題でそうするための偽のコード。

私が知る限り、おそらくCSVファイルを2回ループする必要があります。初めて私はすべてのJSONキーを取得する必要があります。 2回目には、新しいCSVファイルを作成してすべての値を設定することができます。しかし、私は適切に値を書く必要がある列を見つけるでしょうか?

CSVファイルを1つのループ内のオブジェクトの配列に「変換」し、CSVパーサー(http://csv.adaltas.com/)のようなものを使用してCSVファイルに変換する方がパフォーマンスが良いですか?ここで

答えて

0
var express = require('express'); 
var app = express(); 
var bodyParser = require('body-parser'); 
var mysql=require('mysql'); 
var fs= require('fs'); 
var csv = require('fast-csv'); 
var formidable = require('formidable'); 
var urlencodedParser = bodyParser.urlencoded({ extended: false }) 
var con=mysql.createConnection({ 
host:'localhost', 
user:'dheeraj', 
password:'123', 
database:'dheeraj' 
}); 
app.use('/assets',express.static('assets')); 
app.get('/d', function (req, res) { 
    res.sendFile(__dirname + "/" + "/d.html"); 
}) 

app.post('/file_upload', urlencodedParser, function (req, res) { 

    //{ 
    var form = new formidable.IncomingForm(); 
    form.parse(req, function (err, fields, files) { 
    res.write('File uploaded'); 
    //console.log(files.filetoupload); 

    fs.createReadStream(files.filetoupload.name) 
     .pipe(csv()) 
     .on('data',function(data){ 
     var d1=data[0]; 
      var d2=data[1]; 
      var d3=data[2]; 
       var d4=data[3]; 
       var d5=data[4]; 
     con.query('insert into demo values(\''+d1+'\',\''+d2+'\',\''+d3+'\',\''+d4+'\',\''+d5+'\')',function(err,result) 
      { 
       console.log('inserted'); 
      }) 
     console.log(data); 
     }) 
     .on('end',function(data){ 
     console.log('read finished'); 
     }); 

    res.end(); 

}) 
}) 

var server = app.listen(8081, function() { 
var host = server.address().address 
var port = server.address().port 

console.log("Example app listening at http://%s:%s", host, port) 

}) 
+0

このコードは、csvファイルをページにアップロードし、自分のデータベースに挿入できるデータを取得します。それがあなたを助けることを願っています。 –

+0

ありがとうございますが、CSVデータにもJSONデータが含まれているため、これで問題は解決しません。 – Daniel

1

ファイルfilter.jq

[ 
    split("\n")             # split string into lines 
| (.[0] | split(",")) as $headers       # split header 
| (.[1:][] | split(","))          # split data rows 
| select(length>0)            # get rid of empty lines 
| $headers[:-1] as $h1           # fixed headers 
| .[:($h1|length)] as $p1          # fixed part 
| .[($h1|length):] as $p2          # variable part 
| (
    [ [ $h1, $p1 ]           # \ 
     | transpose[]           # \ assemble fixed object 
     | {key:.[0], value:.[1]|tonumber}      #/from fixed keys and values 
    ] | from_entries           #/
) + (
    $p2 | join(",") | fromjson        # assemble variable object 
) 
] 

| (map(keys) | add | unique) as $all       # compute final headers 
| [$all] + (             # add headers to 
     map(. as $b | reduce $all[] as $a ([];. + [$b[$a]])) # objects with all keys 
    | map(map(if . == null then "" else tostring end))  # convert values to strings 
) 
| .[]               # scan final array 
| @csv               # convert to csv 

が含まれており、データがファイル内にある場合jq

を使用したソリューションである

jq -M -R -s -r -f filter.jq data 

その後、dataと呼ばれる

を生成します。
"A","B","C","E","F","G","H" 
"1","2","3","1","2","3","" 
"1","2","3","1","","","2" 
関連する問題