自分用のメモ。元データをJavaやJavaScript内で扱える形式に変換する。以下のようにnodeで実装した。
var fs = require('fs'); var csv = require('csv'); csv() .from.stream(fs.createReadStream(__dirname+'/EmojiSources.txt'), {"delimiter" : ";"}) .to.path(__dirname+'/sample.txt') .transform(function(row){ var elm = row.slice(0, 1); if (elm[0].indexOf('1F') > -1) { var code = parseInt("0x" + elm[0], 16); code -= 0x10000; var hi = code >> 10; var lo = code & 0x3FF; hi |= 0xD800; lo |= 0xDC00; elm[0] = '\\u' + hi.toString(16) + '\\u' + lo.toString(16); elm[1] = String.fromCharCode(hi, lo); } else { elm[1] = String.fromCharCode(parseInt(elm[0], 16)); elm[0] = '\\u' + elm[0] + ''; } return elm; }) .on('record', function(row,index){ console.log('#' + index + ' ' + JSON.stringify(row)); }) .on('close', function(count){ console.log('Number of lines: '+count); }) .on('error', function(error){ console.log(error.message); });
ちなみに適当なファイルをUnicodeエスケープシーケンスに変換するには次のように行う。
var fs = require('fs'); var csv = require('csv'); var combine = function(str, index) { var code = str.charCodeAt(index); if (isNaN(code)) return ""; return '\\u' + (new Array(4 - code.toString(16).length + 1)).join("0") + code.toString(16) + combine(str, ++index); } csv() .from.stream(fs.createReadStream(__dirname+'/src.txt'), {"delimiter" : ","}) .to.path(__dirname+'/dist.txt') .transform(function(row){ var elm = row.slice(0, 1); return '"' + combine(elm[0], 0) + '",\n'; }) .on('record', function(row,index){ console.log('#' + index + ' ' + JSON.stringify(row)); }) .on('close', function(count){ console.log('Number of lines: '+count); }) .on('error', function(error){ console.log(error.message); });