csv - 将 Google Apps 脚本中的 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 接受日期,通过这样做,我似乎删除了所有引号......
请提供有关如何修复它的任何指示?
解决方案
看来我找到了解决方案。额外的逗号只出现在一列中,所以我使用了这个循环:
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, "") ;
}
从列中删除所有逗号。呸!
推荐阅读
- php - 通过键数组更新 PHP 中的值
- rxjs - 使用带有合并映射和管道的 Forkjoin 的 api 请求的返回结果
- javascript - 等到翻译完成 - Ngx 翻译
- python-3.x - NameError:名称“XXX”未定义
- javascript - CSS - 将 div 的 n 个子元素分成 5 列的行
- c - C中两个数字数组(指针)的运算符重载
- reporting-services - 多列 SSRS 上的交互式排序
- c# - 如何仅替换不在c#中的两个引号之间的字符串
- javascript - 如何在 pug 模板中获取 koa 路线的名称?
- javascript - 从节点 js 服务器获取 Ajax 的结果