YUI DataTableからデータを取得して単一のCSVまたはTSV文字列に変換する最も簡単/最速の方法は何ですか?基本的には、ワンクリックでDataTable全体(現在適用されている並べ替えを保持する必要があります)をユーザーがスプレッドシートに貼り付けることができる形式に変換する方法を実装したいと思います。
私のDataTableはかなり大きくなる可能性があります(5000から10000行、5から10列)ので、効率は重要です。
YUI DataTableからデータを取得して単一のCSVまたはTSV文字列に変換する最も簡単/最速の方法は何ですか?基本的には、ワンクリックでDataTable全体(現在適用されている並べ替えを保持する必要があります)をユーザーがスプレッドシートに貼り付けることができる形式に変換する方法を実装したいと思います。
私のDataTableはかなり大きくなる可能性があります(5000から10000行、5から10列)ので、効率は重要です。
このようなものはどうですか:
function dataTableAsCSV (myDataTable) {
var i, j, oData, newWin = window.open(),
aRecs = myDataTable.getRecordSet().getRecords(),
aCols = myDataTable.getColumnSet().keys;
newWin.document.write("<pre>");
for (i=0; i<aRecs.length; i++) {
oData = aRecs[i].getData();
for (j=0; j<aCols.length; j++) {
newWin.document.write( oData[aCols[j].key] + "\t");
}
newWin.document.write("\n");
}
newWin.document.write("</pre>n");
newWin.document.close();
}
データテーブルのコンテンツをTSVとして新しいウィンドウにレンダリングします。タブを含むデータは処理しませんが、それはでの追加の置換にすぎませんoData[aCols[j].key]
。
上記の回答は、バージョン3.4までのYUIでうまく機能します。ただし、データテーブルはバージョン3.5からリファクタリングされました。私のコンバーターは、セル値を二重引用符で囲み、セル値の二重引用符をエスケープし、列のネストが存在する場合は1レベルを処理します。
これが私のコンバーターを示すフィドルです:http://jsfiddle.net/geocolumbus/AFB3h/3/
// Function to convert a DataTable with zero or one nested columns to CSV
function convertToCSV(myDataTable) {
var col,
colIndex = 0,
colKey,
rowString,
ret,
cell,
headerString = "";
while (col = myDataTable.getColumn(colIndex++)) {
if (col.children == null) {
headerString += '"' + col.key + '",';
} else {
Y.Array.each(col.children, function (child) {
headerString += '"' + child.key + '",';
});
}
}
ret = headerString.replace(/,$/, '\n');
Y.Array.each(myDataTable.data.toJSON(), function (item) {
colIndex = 0;
rowString = "";
while (col = myDataTable.getColumn(colIndex++)) {
if (col.children == null) {
cell = item[col.key].replace(/"/g, "\\\"");
rowString += '"' + cell + '",';
} else {
Y.Array.each(col.children, function (child) {
cell = item[child.key].replace(/"/g, "\\\"");
rowString += '"' + cell + '",';
});
}
}
ret += rowString.replace(/,$/, '') + "\n";
});
return ret;
}