如何使用管道定界符导出到.csv

Pat*_*ick 5 csv delimiter google-sheets export-to-csv

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

有没有一种方法可以使用Google表格中的管道分隔符导出到.csv?

Ted*_*noz 6

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

\n\n

在这种情况下,OP 引入了“标准”方法无法解决的两个复杂情况。
\n1) 要由“管道”字符 ( ) 分隔的字段|,以及
\n2) 要用双引号括起来的所有字符串字段。

\n\n

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

\n\n

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

\n\n
\n\n

参数设置

\n\n

该脚本用于识别字符串,以及Dmytro Shevchenko 在Detecting an \xe2\x80\x9cinvalid date\xe2\x80\x9d Date instance in JavaScript 中typeof提到的函数。isValidDate

\n\n
/*\n * script to export data in all sheets in the current spreadsheet as individual csv files\n * files will be named according to the name of the sheet\n * author: Michael Derazon\n * source: https://gist.github.com/mderazon/9655893\n * adapted by Ted Bell for /sf/ask/3447394891/\n */\nfunction onOpen() {\n    var ss = SpreadsheetApp.getActiveSpreadsheet();\n    var csvMenuEntries = [{\n        name: "export as csv file",\n        functionName: "saveAsCSV"\n    }];\n    ss.addMenu("CSV Export", csvMenuEntries);\n};\n\nfunction saveAsCSV() {\n    var ss = SpreadsheetApp.getActiveSpreadsheet();\n    var ssname = ss.getName();\n    var sheet = ss.getActiveSheet();\n    var sheetname = sheet.getSheetName();\n    //Logger.log("DEBUG: the name of the spreadsheet is "+ssname);//DEBUG\n    //Logger.log("DEBUG: the sheet name is "+sheetname);// DEBUG\n\n    //// create a folder from the name of the spreadsheet\n    var folder = DriveApp.createFolder(ssname.toLowerCase() + \'_\' + sheetname.toLowerCase().replace(/ /g, \'_\') + \'_csv_\' + new Date().getTime());\n    //Logger.log("DEBUG: the folder name is "+folder);//DEBUG\n\n    // append ".csv" extension to the sheet name\n    var fileName = ssname + \'_\' + sheetname + ".csv";\n\n    // convert all available sheet data to csv format\n    var csvFile = so_4225484202(fileName);\n\n    // create a file in the Docs List with the given name and the csv data\n    folder.createFile(fileName, csvFile);\n\n    Browser.msgBox(\'Files are waiting in a folder named \' + folder.getName());\n}\n\n\nfunction isValidDate(date) {\n    return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);\n}\n\n\nfunction so_4225484202(filename) {\n\n    var ss = SpreadsheetApp.getActiveSpreadsheet();\n    var sheet = ss.getActiveSheet();\n    var paramsheet = ss.getSheetByName("Parameters");\n\n    var linearray = [];\n    var rowdata = [];\n    var csv = "";\n    var fieldvalue = "";\n\n    var param = paramsheet.getRange(2, 2, 2);\n    var paramValues = param.getValues();\n    //Logger.log("DEBUG: parameters = "+param.getA1Notation());//DEBUG\n    var fieldDelimiter = paramValues[0][0];\n    var textDelimiter = paramValues[1][0];\n    //Logger.log("DEBUG: field delimiter: "+fieldDelimiter+", text delim: "+textDelimiter);//DEBUG\n\n\n    var rangeData = sheet.getDataRange();\n    var lastColumn = rangeData.getLastColumn();\n    var lastRow = rangeData.getLastRow();\n    //Logger.log("DEBUG: lastColumn: "+lastColumn+", lastRow: "+lastRow);//DEBUG\n\n    // Get array of values in the Data Range\n    var rangeValues = rangeData.getValues();\n\n    // Loop through array and build values for csv\n    for (i = 0; i < lastRow; i++) {\n        for (j = 0; j < lastColumn; j++) {\n\n            var value = rangeValues[i][j];\n            var theType = typeof value;\n\n            if (theType === "object") {\n                var testdate = isValidDate(value);\n                //Logger.log("if typeof is object: testdate: "+testdate);//DEBUG\n                var testtype = typeof testdate;\n                if (testtype === "boolean") {\n                    // variable is a boolean\n                    //Logger.log("Its a date");//DEBUG\n                    theType = "date";\n                } else {\n                    //Logger.log("Its not a date");//DEBUG\n                }\n            }\n            if (theType === "string") {\n                value = textDelimiter + value + textDelimiter;\n            }\n\n            rowdata.push([value]);\n        };\n\n        //Logger.log("DEBUG: rowdata: "+rowdata);//DEBUG\n        csv += rowdata.join(fieldDelimiter) + "\\n";\n        var rowdata = [];\n\n    };\n\n    //Logger.log("DEBUG: csv: "+csv);//DEBUG\n    return csv;\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

电子表格包含示例数据。\n大约 5 秒内即可处理并保存包含近 1,000 条记录的工作表。

\n


Pat*_*ick 0

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