从 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]
.
上面的答案适用于 YUI 到 3.4 版。但是,数据表从 3.5 版开始进行了重构。我的转换器将单元格值括在双引号中,在单元格值中转义双引号并处理一层列嵌套(如果存在)。
这是一个演示我的转换器的小提琴: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;
}