上传谷歌应用程序脚本中的CSV文件到BigQuery表-行中的流氓逗号



大家好,

背景故事:我有一份CSV文件的报告,每天通过电子邮件发送给我。我试图在GAS中创建一个脚本,在Google Drive中下载CSV文件,然后将其上传到BigQuery表中。GAS是我们唯一启用的脚本工具,所以我一直使用它。我对JavaScript和BigQuery API 都是新手

代码:

function testFunction() {
var file = DriveApp.getFilesByName("my_csv_file.csv")
var csv = file.next().getBlob().setContentType('application/octet-stream').getDataAsString();
var csvData = Utilities.parseCsv(csv);
// I need to do the following to get the yyyy-MM-dd format
for (var i = 1; i < csvData.length; i++) {
var csvdate = csvData[i][1];
csvData[i][1] = csvdate.substring(6, 10) + "-" + csvdate.substring(3, 5) + "-" + csvdate.substring(0, 2);
}
var csvString = csvData.join("n");  
var blob = Utilities.newBlob(csvString, "text/csv")
var data = blob.setContentType('application/octet-stream');
var projectId = 'my_project_id';
var datasetId = 'my_dataset';
var tableId   = 'bigquery_table';
var job = {
configuration: {
load: {
destinationTable: {
projectId: projectId,
datasetId: datasetId,
tableId: tableId
},
source_format: 'CSV',
skipLeadingRows: 1,
allowJaggedRows: 'TRUE',
allow_quoted_newlines: 'TRUE',
}
}
};
job = BigQuery.Jobs.insert(job, projectId, data);
}

我得到的工作错误:

Error encountered during job execution:
Error while reading data, error message: CSV table encountered too many errors, giving up. Rows: 1290; errors: 1. Please look into the errors[] collection for more details.
Failure details:
- Error while reading data, error message: Too many values in row
starting at position: 239165.
- You are loading data without specifying data format, data will be
treated as CSV format by default. If this is not what you mean,
please specify data format by --source_format.

我不明白的是:我正在指定source_format-我做错了吗?

我发现问题的地方是:某些行中的值太多,因为列太多。列太多了,因为有些产品描述中有出血逗号。原始的CSV文件将所有单元格都封装在引号中——我想这是解决这个问题的好方法。问题是,我需要更改日期列的格式,以便BigQuery接受is作为日期,这样做,我似乎删除了所有引号。。。

有什么建议可以帮我解决吗?

我似乎找到了解决方案。额外的逗号只出现在一列中,所以我使用了这个循环:

for (var i = 1; i < csvData.length; i++) {
var csvdate = csvData[i][1];
csvData[i][1] = csvdate.substring(6, 10) + "-" + csvdate.substring(3, 5) + "-" + csvdate.substring(0, 2);
}

添加一个附加步骤:

for (var i = 1; i < csvData.length; i++) {
var csvdate = csvData[i][1];
csvData[i][1] = csvdate.substring(6, 10) + "-" + csvdate.substring(3, 5) + "-" + csvdate.substring(0, 2);
var csvdesc = csvData[i][4];
csvData[i][4] = csvdesc.replace(/([,])+/g, "") ;
}

它从列中删除所有逗号。呜呜!

原始CSV文件的所有单元格都封装在引号中

然后,执行同样的操作。

var csvString = csvData.map(function (row){
return '"' + row.join('","') + '"';
}).join('n')

最新更新