【问题标题】:Import CSV data into Google Sheets将 CSV 数据导入 Google 表格
【发布时间】:2020-02-23 09:03:52
【问题描述】:

当尝试对该文件使用IMPORTDATA 函数时:

https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset#players_20.csv

出现意外错误,提示无法将数据导入电子表格。有没有其他方法可以将这些数据带到我的电子表格中?

这些数据对我正在做的工作非常重要。能够键入和复制所有内容,然后根据我的需要进行过滤,这将节省我将近 3 个月的工作时间。

能够导入至少所有玩家的简单信息非常重要,但不一定必须导入每个玩家的所有信息列。可以导入的列数已经很完美了。

如果有什么办法,我将不胜感激。

【问题讨论】:

  • 你试过Utilities.parseCsv()吗?
  • 看起来您共享的 the link 在技术上是一个 HTML 页面,而不是一个 CSV。当我尝试通过其他按钮直接从 Kaggle 下载工作表时,它会弹出一个 zip 文件。您能否找到实际上包含数据文件的直接csv 链接?我们应该能够帮助轻松导入。

标签: csv google-apps-script google-sheets opencsv kaggle


【解决方案1】:
  • 您想从https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset 下载players_20.csv 的CSV 文件并将CSV 数据放到电子表格中。
  • 您希望使用 Google Apps 脚本实现此目的。

如果我的理解是正确的,那么这个答案呢?请认为这只是几个答案之一。

问题和解决方法:

很遗憾,无法从https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset#players_20.csv 的 URL 直接下载 CSV 数据。要下载 CSV 文件,需要登录 kaggle。与其他模式一样,您也可以使用 API 下载它。在这个答案中,为了下载 CSV 文件,我使用了 Kaggle 的公共 API。

用法:

1。检索令牌文件:

在使用脚本之前,请先注册一个https://www.kaggle.com的账号,并获取token文件。关于如何获取token文件,可以看the official document

为了使用 Kaggle 的公共 API,您必须首先使用 API 令牌进行身份验证。在站点标题中,单击您的用户个人资料图片,然后从下拉菜单中单击“我的帐户”。这会将您带到https://www.kaggle.com/account 的帐户设置。向下滚动到标有 API 的页面部分:

要创建新令牌,请单击“创建新 API 令牌”按钮。这会将新的身份验证令牌下载到您的计算机上。

在此脚本中,使用了下载的令牌文件中的令牌对象。

2。运行脚本:

请将以下脚本复制并粘贴到电子表格的容器绑定脚本中。请设置csvFilenamepathtokenObject的变量。在你的情况下,我已经设置了csvFilenamepath。所以请只设置你的令牌对象。

function myFunction() {
  var csvFilename = "players_20.csv"; // Please set the CSV filename.
  var path = "stefanoleone992/fifa-20-complete-player-dataset"; // Please set the path.
  var tokenObject = {"username":"###","key":"###"}; // <--- Please set the token object.
  
  var baseUrl = "https://www.kaggle.com/api/v1/datasets/download/";
  var url = baseUrl + path;
  var params = {headers: {Authorization: "Basic " + Utilities.base64Encode(tokenObject.username + ':' + tokenObject.key)}};
  var blob = UrlFetchApp.fetch(url, params).getBlob();
  var csvBlob = Utilities.unzip(blob).filter(function(b) {return b.getName() == csvFilename});
  if (csvBlob.length == 1) {
    var csvData = Utilities.parseCsv(csvBlob[0].getDataAsString());
    var sheet = SpreadsheetApp.getActiveSheet();
    sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
  } else {
    throw new Error("CSV file of " + csvFilename + " was not found.");
  }
}
流动:

这个脚本的流程如下。

  1. 当脚本运行时,kaggle datasets download -d stefanoleone992/fifa-20-complete-player-dataset 的 kaggle 命令与 Google Apps 脚本一起运行。这样,ZIP 文件就被下载了。
  2. 从下载的 ZIP 文件中检索 csvFilename 的 CSV 文件。
  3. 从 CSV 文件解析 CSV 数据。
  4. 将 CSV 数据放入活动工作表。
    • 在此脚本中,所有数据都使用 blob 进行处理。所以文件没有被创建。

注意:

  • CSV 数据似乎很大。所以请等到脚本完成。
    • 在我的环境中,我花了大约 150 秒的时间将 CSV 数据放入电子表格。
    • players_20.csv的CSV数据有18279行104列。
  • 如果Utilities.unzip(blob)出现错误,请测试将var blob = UrlFetchApp.fetch(url, params).getBlob()修改为var blob = UrlFetchApp.fetch(url, params).getBlob().setContentTypeFromExtension()

参考资料:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

新增1:

如果要选择要放置的列,请将上面的示例脚本修改如下。

发件人:

var csvData = Utilities.parseCsv(csvBlob[0].getDataAsString());
var sheet = SpreadsheetApp.getActiveSheet();

收件人:

var csvData = Utilities.parseCsv(csvBlob[0].getDataAsString());
var needColumns = [1, 2, 3];
csvData = csvData.map(function(row) {return needColumns.map(function(col) {return row[col]})});
var sheet = SpreadsheetApp.getActiveSheet();
  • 在上述修改中,作为测试用例,将 1、2 和 3 列放入电子表格。

新增2:

例如来自the result of benchmark for putting CSV data to Spreadsheet,使用Sheets API 来放置CSV 数据怎么样?为此,请按如下方式修改上述示例脚本。在运行脚本之前,please enable Sheets API at Advanced Google services.

发件人:

var csvData = Utilities.parseCsv(csvBlob[0].getDataAsString());
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);

收件人:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var resource = {requests: [{pasteData: {data: csvBlob[0].getDataAsString(), coordinate: {sheetId: sheet.getSheetId()}, delimiter: ","}}]};
Sheets.Spreadsheets.batchUpdate(resource, ss.getId());
  • 在这种情况下,我花了大约 50 秒的时间将 CSV 数据放入电子表格。

参考:

【讨论】:

  • 现在我可以理解导入数据的差异......这不仅仅是因为它导入,而是我需要管理整个寄存器才能访问它们。再次感谢并祝贺您一直以来的耐心教导!
  • @Frederico Mattos 感谢您的回复。在我的环境中,我也可能会看到与您的情况相同的问题。在这种情况下,认为所有的值都还没有放好。那么如何等待完全放置所有值呢?因为正如我所说,CSV 数据很大。如果你想把特定的列放到电子表格中,我提出了一个修改过的脚本。你能确认一下吗?即使您使用此修改,当列数很大时,也可能会出现相同的情况。请注意这一点。
  • @Frederico Mattos 感谢您的回复。 CSV 数据的总单元格约为 190 万个单元格。所以当通过过滤检索特定列时,可以降低成本。在当前阶段,这种方法可能适合您的情况。
  • @Frederico Mattos 我提议再修改一个脚本。你能确认一下吗?在这种情况下,为了放置所有 CSV 数据,使用了 Sheets API。如果这对您的情况没有用,我必须道歉。
  • 它在每次尝试中都能完美运行,没有任何错误。非常感谢!
猜你喜欢
  • 2013-11-05
  • 1970-01-01
  • 2018-08-10
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2023-01-01
  • 2016-06-23
相关资源
最近更新 更多