繁体   English   中英

将 CSV 数据导入 Google 表格

[英]Import CSV data into Google Sheets

尝试对此文件使用IMPORTDATA function 时:

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

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

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

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

如果有任何方法,我将不胜感激。

  • You want to download a CSV file of players_20.csv from https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset and put the CSV data to the Spreadsheet.
  • 您想使用 Google Apps 脚本实现此目的。

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

问题和解决方法:

Unfortunately, the CSV data cannot be directly downloaded from the URL of https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset#players_20.csv . 要下载 CSV 文件,需要登录 kaggle。 作为其他模式,您也可以使用 API 下载它。 在这个答案中,为了下载 CSV 文件,我使用了 Kaggle 的公共 API。

用法:

1.检索令牌文件:

在使用脚本之前,请先在https://www.kaggle.com上注册一个账号,然后取回 token 文件。 关于如何获取token文件,可以看官方文档

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

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

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

2.运行脚本:

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

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 Script 一起运行。 至此,ZIP 文件被下载。
  2. 从下载的 ZIP 文件中检索csvFilename的 CSV 文件。
  3. 解析 CSV 文件中的 CSV 数据。
  4. 将 CSV 数据放到活动表中。
    • 在此脚本中,所有数据都使用 blob 进行处理。 所以文件没有被创建。

笔记:

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

参考:

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

添加1:

如果你想 select 你想放的列,请修改上面的示例脚本如下。

从:

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();

至:

 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:

将 CSV 数据放入 Spreadsheet 的基准测试结果来看,例如,使用 Sheets API 放入 CSV 数据怎么样? 为此,请按如下方式修改上述示例脚本。 在运行脚本之前, 请在高级 Google 服务中启用表格 API。

从:

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());

至:

 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 数据放入电子表格。

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM