2014年5月3日 星期六

Node.js / JavaScript處理含逗號的CSV格式字串

這幾天遇到一個棘手的問題
我需要處理一個CSV-like的字串
字串是逗號隔開的CSV格式
數字部分不加單引號、其他格式使用單引號隔開...
而字串中欄位有可能出現逗號(,)或是跳脫的單引號(\')
範例:
1,'aaa,bbb,ccc','asdf','a12\'3\'4'
2,'aab,bbb,ccc','asdf','b12\'3\'4'
如果你跟我一樣,一開始就以Parser的角度,split後去處理文字....
或是想到Regular Expression去...
那應該頭痛一天也不會有答案...
我最後的答案是...... (沒有看不懂的Regular Expression, 也沒有逐字去拆解分析...)
file: data.csv
> 1,'aaa,bbb,ccc','asdf','a12\'3\'4'

file: test.js
> var fs = require('fs');
> var data = fs.readFileSync('/tmp/data.csv', 'utf-8');
> data.split('\n').forEach(function(v) {
>   if(v.length >0) {
>     console.log(parseArr(v));
>   }
> });
> function parseArr(v) {
>   eval('var arr = [' + v + ']');
>   return arr;
> }
關鍵是紅色的那行
透過javascript的eval方式將字串組織回來...