如何使用谷歌应用脚​​本在 BigQuery 中导入 csv 日期格式

Posted

技术标签:

【中文标题】如何使用谷歌应用脚​​本在 BigQuery 中导入 csv 日期格式【英文标题】:How to import csv date format in BigQuery uisng google appscript 【发布时间】:2017-08-27 06:09:16 【问题描述】:

我的数据以 CSV 格式存储,格式为 2017-08-07,我的日期列在 BQ 中定义为字符串字段。当我尝试在 BigQuery 中导入我的所有数据时,所有日期数据都已转换为 Mon Aug 07 2017 00:00:00 GMT+0800 (HKT)。我想以 2017-08-07 格式导入所有日期范围,但它正在使用上述格式进行转换。下面是我的 CSV 脚本,用于在 BQ 中上传数据:

function test() 

  var projectId = 'test1';
  var datasetId = 'YoutubeNG';
     var yestDate = new Date();
      yestDate.setDate(yestDate.getDate()-2);
   var formattedDate = Utilities.formatDate(yestDate, "GMT", "yyyy-MM-dd");

  var tableId = 'Youtube_Keystats_NG';
  var fileId = '1y4xTZ4g1c08D8NOU0O-SWsi-5uyi9ukOuKLD5yz03cY';

  // Define our load job.
  var jobSpec = 
    configuration: 
      load: 
        destinationTable: 
          projectId: projectId,
          datasetId: datasetId,
          tableId: tableId
        ,
        allowJaggedRows: true,
        writeDisposition: 'WRITE_TRUNCATE',
        schema: 
          fields: [name:'Date', type: 'STRING',mode:'NULLABLE',
                   name:'Account_ID', type: 'INTEGER',mode:'NULLABLE',
                   name:'Account', type: 'STRING',mode:'NULLABLE',
                   name:'Campaign_ID', type: 'INTEGER',mode:'NULLABLE',
                   name:'Campaign_name', type: 'STRING',mode:'NULLABLE',
                   name:'Impressions', type: 'INTEGER',mode:'NULLABLE',
                   name:'Clicks', type: 'INTEGER',mode:'NULLABLE',
                   name:'Cost', type: 'FLOAT',mode:'NULLABLE',
                   name:'Conversions', type: 'FLOAT',mode:'NULLABLE',
                   name:'Value_per_conversion', type: 'FLOAT',mode:'NULLABLE',
                   name:'Total_conversion_value', type: 'FLOAT',mode:'NULLABLE',
                   name:'Average_position', type: 'FLOAT',mode:'NULLABLE',

          ]
        
      
    
  ;

  var spreadsheet = SpreadsheetApp.openById(fileId);
  var filename = spreadsheet.getName();

  var MAX_ROWS = 50000;
  var sheet = spreadsheet.getSheetByName(tableId); 
  //var sheet = spreadsheet.getSheets()[0]; //.getSheetByName("Expenses")
  var data = sheet.getDataRange().getValues();
  var csvdata = "";
  for (var row = 1; row < data.length && row < MAX_ROWS + 1; row++) 
    for (var col = 0; col < data[row].length; col++) 
      var cell = data[row][col].toString();
      if (cell.indexOf(",") != -1) 
        csvdata += "\"" + cell + "\"";
       else 
        csvdata += cell;
      

      if (col < data[row].length - 1) 
        csvdata += ",";
      
    
    csvdata += "\r\n";
  
  var data = Utilities.newBlob(csvdata, "application/octet-stream");

  // Execute the job.
  BigQuery.Jobs.insert(jobSpec, projectId, data);

【问题讨论】:

您的意思是数据库中的日期是日期?这正是你想要的。现在您可以向数据库询问您想要的格式。 ( dd/mm/yyyy, yyyy-mm-dd ....)。不要以为你看到的就是数据库上的。 我的意思是我的 csv 中的日期格式是 2017-08-07 但是当使用上述代码上传到 Bigquery 时,它被转换为 Mon Aug 07 2017 00:00:00 GMT+0800 (HKT )。我想在 BigQuery 中显示日期日期为 2017-08-07 NOT Mon Aug 07 2017 00:00:00 GMT+0800 (HKT) 【参考方案1】:

据我了解,var cell = data[row][col].toString(); 行会将单元格的内容转换为字符串。导入日期后,日期已存储为 dateTime 类型,并将使用标准格式转换为字符串,因此是不希望的输出。 您必须使用您想要的格式显式转换您的 dateTime 列。 为了更好地了解内部发生的情况,我建议您使用调试器查看单元格的内容。

【讨论】:

日期已设置为 STRING 数据类型。问题是,在我的 csv 中,我的日期数据为 2017-08-07,但是在 BQ 中上传时,它显示为 Mon Aug 07 2017 00:00:00 GMT+0800 (HKT)。不知道为什么要转换。

以上是关于如何使用谷歌应用脚​​本在 BigQuery 中导入 csv 日期格式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 中导出所有谷歌分析数据 [重复]

如何使用谷歌应用脚​​本将视频从谷歌驱动器上传到 YouTube?

如何在 App Script 中加入两个表并将数据提取到大查询现有表中

如何使用谷歌应用脚​​本发送电子邮件草稿

如何使用谷歌应用脚​​本找到最后一列?

使用谷歌应用脚​​本更新数据验证规则时如何保留原始范围