簡體   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