2016-08-09 38 views
0

私は、APIからのデータをいくつかのファイルに書き込むスクリプトを用意しています。fs.readFileSyncは常に空の文字列を返します

var csvFds = { 
    'file1' : null, 
    'file2' : null, 
    'file3' : null, 
    'file4' : null 
}; 

for (var file in csvFds) { 

    var dirPath = __dirname + '/files/' + file; 

    try { 
     fs.statSync(dirPath); 
    } 
    catch (e) { 
     mkdirp.sync(dirPath, {mode: 0755}); 
    } 

    csvFds[file] = fs.openSync(dirPath + '/' + moment().format("YYYY-MM-DDTHH:mm:ss[Z]") + '.csv', 'a+'); 
} 

その後、私はバッチでファイルをCSV形式の行を書くことfs.writeを使用していくつかのコードを持っている:私はインクルードは、各ファイルのファイル記述子が含まれているオブジェクトを持っています。この部分は正常に動作しています。私はCSVファイルを整えています。今度は、ファイル全体の内容を文字列として読み込む必要があります。これは私がそれをやろうとする方法です:

fs.readFileSync(csvFds['file1']).toString(); 

しかし、私はいつも空の文字列を取得しています。私は、fs.readFileSyncが実際にはconsole.logを使用してtoString()メソッドを削除することでBufferを返すことを確認しました。

私は本当にこれに固執していますので、どんな助けでも大歓迎です。前もって感謝します。ここに私のノードのバージョンやOSに関するいくつかの追加情報があります:

$ node -v 
v6.2.3-pre 

$ uname -a 
Darwin i-2.local 14.5.0 Darwin Kernel Version 14.5.0: Thu Jun 16 19:58:21 PDT 2016; root:xnu-2782.50.4~1/RELEASE_X86_64 x86_64 
+0

'readFileSync'メソッドにエンコーディングを指定すると、' Buffer'の代わりに文字列が得られます。 – mic4ael

答えて

0

このreadFileSync(csvFds['file1'], 'utf-8')ようreadFileSyncを呼び出すようにしてください。それは文字列を返す必要があります。または、引数を省略してtoStringメソッドを呼び出すときにエンコードを指定することもできます。 readFileSync(csvFds['file1']).toString('utf-8')

+0

Hey Michael。私は実際にこれらのことを以前に試してみましたが、もう一度やりました。しかし、私はまだ空の文字列を取得します。これをデバッグするには、ファイルディスクリプタまたはバッファに関する情報を得るための方法が必要です。私はノードのバージョンを切り替えようとしています。 –

+0

csvFds辞書に正しいデータが含まれていますか? forループ終了後にcsvFdsに含まれる内容を表示できますか? – mic4ael

+0

それは野生の推測ですが、コードのこの作品 'now.getTimeは()'私には少し疑わしい – mic4ael

関連する問題