如何使用管道分隔符导出到.csv

问题描述 投票:0回答:3

我使用 Google Sheets(电子表格)来合并我的 Gambio 商店的不同来源的文章数据。 要导入数据,我需要在 .csv 文件中使用管道符号作为分隔符/分隔符,并使用 " 作为文本分隔符。 在用于导出到 .csv 的 Google 表格菜单中没有选项。

有没有办法在 Google 表格中使用管道分隔符导出到 .csv?

csv google-sheets export-to-csv delimiter
3个回答
6
投票

有多种方法可以从 Google 表格导出电子表格和/或工作表。将工作表导出为 csv 文件内置于 Google 表格(文件、下载、CSV)中。

在这种情况下,OP 引入了“标准”方法无法解决的两个复杂情况。
1) 由“管道”字符 (

|
) 分隔的字段,以及
2) 所有字符串字段都用双引号括起来。

GitHub 上有多个脚本可以自动将工作表另存为 csv。 Michael Drazon 的 export-named-sheet-as-csv.gs (https://gist.github.com/mderazon/9655893) 就是一个示例,我用它作为此代码的基础。但是,这些脚本遵循使用逗号作为字段分隔符的“正常”规则,并且没有对字符串进行特殊处理。

以下代码将活动工作表保存为 csv 文件,并提供管道字段分隔符和字符串周围的双引号。用户可以通过编辑参数表上的字段来指定这些参数,如本屏幕截图所示。


该脚本使用

typeof
来识别字符串,以及 Dmytro Shevchenko 在
Detecting an “invalid date”Date instance in JavaScript
中指出的函数 isValidDate

/*
 * script to export data in all sheets in the current spreadsheet as individual csv files
 * files will be named according to the name of the sheet
 * author: Michael Derazon
 * source: https://gist.github.com/mderazon/9655893
 * adapted by Ted Bell for https://stackoverflow.com/questions/49248498/how-can-i-export-to-csv-with-pipe-delimiter
 */
function onOpen() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var csvMenuEntries = [{
        name: "export as csv file",
        functionName: "saveAsCSV"
    }];
    ss.addMenu("CSV Export", csvMenuEntries);
};

function saveAsCSV() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var ssname = ss.getName();
    var sheet = ss.getActiveSheet();
    var sheetname = sheet.getSheetName();
    //Logger.log("DEBUG: the name of the spreadsheet is "+ssname);//DEBUG
    //Logger.log("DEBUG: the sheet name is "+sheetname);// DEBUG

    //// create a folder from the name of the spreadsheet
    var folder = DriveApp.createFolder(ssname.toLowerCase() + '_' + sheetname.toLowerCase().replace(/ /g, '_') + '_csv_' + new Date().getTime());
    //Logger.log("DEBUG: the folder name is "+folder);//DEBUG

    // append ".csv" extension to the sheet name
    var fileName = ssname + '_' + sheetname + ".csv";

    // convert all available sheet data to csv format
    var csvFile = so_4225484202(fileName);

    // create a file in the Docs List with the given name and the csv data
    folder.createFile(fileName, csvFile);

    Browser.msgBox('Files are waiting in a folder named ' + folder.getName());
}


function isValidDate(date) {
    return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
}


function so_4225484202(filename) {

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    var paramsheet = ss.getSheetByName("Parameters");

    var linearray = [];
    var rowdata = [];
    var csv = "";
    var fieldvalue = "";

    var param = paramsheet.getRange(2, 2, 2);
    var paramValues = param.getValues();
    //Logger.log("DEBUG: parameters = "+param.getA1Notation());//DEBUG
    var fieldDelimiter = paramValues[0][0];
    var textDelimiter = paramValues[1][0];
    //Logger.log("DEBUG: field delimiter: "+fieldDelimiter+", text delim: "+textDelimiter);//DEBUG


    var rangeData = sheet.getDataRange();
    var lastColumn = rangeData.getLastColumn();
    var lastRow = rangeData.getLastRow();
    //Logger.log("DEBUG: lastColumn: "+lastColumn+", lastRow: "+lastRow);//DEBUG

    // Get array of values in the Data Range
    var rangeValues = rangeData.getValues();

    // Loop through array and build values for csv
    for (i = 0; i < lastRow; i++) {
        for (j = 0; j < lastColumn; j++) {

            var value = rangeValues[i][j];
            var theType = typeof value;

            if (theType === "object") {
                var testdate = isValidDate(value);
                //Logger.log("if typeof is object: testdate: "+testdate);//DEBUG
                var testtype = typeof testdate;
                if (testtype === "boolean") {
                    // variable is a boolean
                    //Logger.log("Its a date");//DEBUG
                    theType = "date";
                } else {
                    //Logger.log("Its not a date");//DEBUG
                }
            }
            if (theType === "string") {
                value = textDelimiter + value + textDelimiter;
            }

            rowdata.push([value]);
        };

        //Logger.log("DEBUG: rowdata: "+rowdata);//DEBUG
        csv += rowdata.join(fieldDelimiter) + "\n";
        var rowdata = [];

    };

    //Logger.log("DEBUG: csv: "+csv);//DEBUG
    return csv;

}

电子表格包含示例数据。 一张包含近 1,000 条记录的工作表的处理和保存时间约为 5 秒。


0
投票

实际上我并没有让它在 Google 世界中发生。 我的解决方法是使用像Sublime Text这样的编辑器来标记所有管道分隔符并用分号替换它们以在工作表中导入。


0
投票

它来了...Libreoffice 来救援! 您可以免费安装它https://www.libreoffice.org/download/download-libreoffice

复制并粘贴 Google 表格内容(或者仅导出表格并使用 libreoffice 打开它)。

然后使用“另存为...”选项,选择“文本 CSV”作为文件格式,并确保选中“编辑过滤器设置...”选项,然后单击“保存”,系统将询问您不同的信息导出文件的选项,其中之一是要使用的分隔符。

Linux 保佑你们...

© www.soinside.com 2019 - 2024. All rights reserved.