将CSV数据导入Google表格

时间:2019-10-28 02:31:55

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

尝试对此文件使用IMPORTDATA功能时

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

发生意外错误,表明无法将数据导入电子表格。还有什么其他方法可以将这些数据带到电子表格中?

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

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

如果能的话,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

  • 您要从players_20.csv下载https://www.kaggle.com/stefanoleone992/fifa-20-complete-player-dataset的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注册一个帐户,然后检索令牌文件。关于如何检索令牌文件,您可以看到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数据放入电子表格中。

参考: