使用 Google Apps 脚本将多个 .CSV 文件从 Google Drive 导入 BigQuery
Use Google Apps Script to import multiple .CSV files from Google Drive into BigQuery
我已经从美国运通门户网站下载了一年的 .CSV 文件。我想使用 Google Apps 脚本获取这些数据并将其放入 Google BigQuery。不能真正以交互方式执行此操作,因为 BigQuery UX 不提供将数据附加到 table 的机制。所以,我写了一个脚本来做到这一点:
var firstFileData = firstFile.getBlob().setContentType('application/octet-stream')
var firstFileDataString = firstFileData.getDataAsString()
var firstFileDataCSV = Utilities.parseCsv(firstFileDataString)
变量 firstFileDataString
以 CSV 的内容结尾,但我注意到换行符不存在。因此,程序中的逻辑进一步向下看到许多列而不是所需的 3。我所做的一些阅读表明创建 .CSV 文件的现代方法不使用换行符 \n
,有利于马车 return \r
代替。
实施 RegExp 来查找(并替换)回车 return 似乎也无法解决该问题。
我确实使用 RegExp 解决了这个问题,但也将换行符 \n
插入到调用 Utilities.parseCsv()
产生的数组中。我的感觉是有一个更有效的方法,但这确实有效:
if((j == 0) && (!flg_includeHeader)) {
// importCSVintoBigQuery(firstFileData, 1, theProjectId, theDataSetId, theTableId)
j++
}
else {
t_record_sub.push([t_db_date],[firstFileDataCSV[j][1]],[firstFileDataCSV[j][2]] + "\n")
}
}
var regex = new RegExp(('\n,'),'gi')
t_record.push([t_record_sub])
theBlob = Utilities.newBlob(t_record.toString().replace(regex, '\n'), 'application/octet-stream')
也许你可以只使用:
t_record_sub.push([t_db_date, firstFileDataCSV[j][1], firstFileDataCSV[j][2]])
而不是:
t_record_sub.push([t_db_date],[firstFileDataCSV[j][1]],[firstFileDataCSV[j][2]] + "\n")
那么,您可能不需要使用正则表达式进行替换。
如果你想从二维数组中创建一个字符串,它可以是这样的:
var string = t_record_sub.map(x => x.join(',')).join('\n');
这是将平面数组转换为二维数组(3 列)然后转换为字符串的代码片段:
var flat_array = [1,2,3,4,5,6,7,8,9];
var t_record_sub = [];
var i = 0;
while (i < flat_array.length) {
t_record_sub.push([flat_array[i++], flat_array[i++], flat_array[i++]]);
}
var string = t_record_sub.map(x => x.join(',')).join('\n');
console.log(string);
// output:
// 1,2,3
// 4,5,6
// 7,8,9
或者更简单:直接从平面数组到字符串:
var array = [1,2,3,4,5,6,7,8,9];
var i = 0;
var string = '';
while (i < flat_array.length) {
string += array[i++] + ',' + array[i++] + ',' + array[i++] + '\n'
}
console.log(string.slice(0,-1)); // slice to remove the last '\n'
// the same output
我已经从美国运通门户网站下载了一年的 .CSV 文件。我想使用 Google Apps 脚本获取这些数据并将其放入 Google BigQuery。不能真正以交互方式执行此操作,因为 BigQuery UX 不提供将数据附加到 table 的机制。所以,我写了一个脚本来做到这一点:
var firstFileData = firstFile.getBlob().setContentType('application/octet-stream')
var firstFileDataString = firstFileData.getDataAsString()
var firstFileDataCSV = Utilities.parseCsv(firstFileDataString)
变量 firstFileDataString
以 CSV 的内容结尾,但我注意到换行符不存在。因此,程序中的逻辑进一步向下看到许多列而不是所需的 3。我所做的一些阅读表明创建 .CSV 文件的现代方法不使用换行符 \n
,有利于马车 return \r
代替。
实施 RegExp 来查找(并替换)回车 return 似乎也无法解决该问题。
我确实使用 RegExp 解决了这个问题,但也将换行符 \n
插入到调用 Utilities.parseCsv()
产生的数组中。我的感觉是有一个更有效的方法,但这确实有效:
if((j == 0) && (!flg_includeHeader)) {
// importCSVintoBigQuery(firstFileData, 1, theProjectId, theDataSetId, theTableId)
j++
}
else {
t_record_sub.push([t_db_date],[firstFileDataCSV[j][1]],[firstFileDataCSV[j][2]] + "\n")
}
}
var regex = new RegExp(('\n,'),'gi')
t_record.push([t_record_sub])
theBlob = Utilities.newBlob(t_record.toString().replace(regex, '\n'), 'application/octet-stream')
也许你可以只使用:
t_record_sub.push([t_db_date, firstFileDataCSV[j][1], firstFileDataCSV[j][2]])
而不是:
t_record_sub.push([t_db_date],[firstFileDataCSV[j][1]],[firstFileDataCSV[j][2]] + "\n")
那么,您可能不需要使用正则表达式进行替换。
如果你想从二维数组中创建一个字符串,它可以是这样的:
var string = t_record_sub.map(x => x.join(',')).join('\n');
这是将平面数组转换为二维数组(3 列)然后转换为字符串的代码片段:
var flat_array = [1,2,3,4,5,6,7,8,9];
var t_record_sub = [];
var i = 0;
while (i < flat_array.length) {
t_record_sub.push([flat_array[i++], flat_array[i++], flat_array[i++]]);
}
var string = t_record_sub.map(x => x.join(',')).join('\n');
console.log(string);
// output:
// 1,2,3
// 4,5,6
// 7,8,9
或者更简单:直接从平面数组到字符串:
var array = [1,2,3,4,5,6,7,8,9];
var i = 0;
var string = '';
while (i < flat_array.length) {
string += array[i++] + ',' + array[i++] + ',' + array[i++] + '\n'
}
console.log(string.slice(0,-1)); // slice to remove the last '\n'
// the same output