将 Google Apps 脚本中的 CSV 文件上传到 BigQuery 表 - 行中的恶意逗号
Posted
技术标签:
【中文标题】将 Google Apps 脚本中的 CSV 文件上传到 BigQuery 表 - 行中的恶意逗号【英文标题】:Uploading CSV file in Google Apps Script to BigQuery table - rogue commas in rows 【发布时间】:2019-02-10 18:56:25 【问题描述】:大家好,
背景故事: 我每天都有一份 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 接受日期,通过这样做,我似乎删除了所有引号......
请指点我如何解决它?
【问题讨论】:
请注意,例如,与skipLeadingRows
相比,您使用不同的大小写编写 source_format
。您需要使用sourceFormat
和allowQuotedNewlines
而不是您当前的拼写。不过,我不确定这是否是唯一的问题。
【参考方案1】:
看来我找到了解决办法。额外的逗号只出现在一列中,所以我使用了这个循环:
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, "") ;
从列中删除所有逗号。呸!
【讨论】:
【参考方案2】:原始 CSV 文件的所有单元格都用引号括起来
然后,做同样的事情。
var csvString = csvData.map(function (row)
return '"' + row.join('","') + '"';
).join('\n')
【讨论】:
谢谢,但这并不能解决问题。方式中已经有一个逗号,上述解决方案只是将引号放在已经拆分的单元格周围......所以例如 "Product description, with a comma" 变成 "Product description","with a comma" @ErrHuman 在您的问题中提供示例my_csv_file.csv
、csvData
和csvString
。您可以使用调试运行来查看这些数据
谢谢 - 我已经设法回答了我自己的问题。我需要弄清楚如何使用调试运行以供将来参考 - 即使我单击行号以创建红点,调试运行也会不间断地通过函数,我无法提取任何数据......跨度>
以上是关于将 Google Apps 脚本中的 CSV 文件上传到 BigQuery 表 - 行中的恶意逗号的主要内容,如果未能解决你的问题,请参考以下文章
使用 Google AppS 脚本将 .csv 文件转换为 .xls
Google Apps 脚本 setTimestamp 到 mysql 数据库
用于将 google drive 中的文件名列表与 google sheet 列中的名称列表进行比较的 Apps 脚本,以将新文件从驱动器添加到工作表