Загрузка файла CSV в Google Apps Script в таблицу BigQuery - мошеннические запятые в строках - PullRequest
0 голосов
/ 10 февраля 2019

Добрый день всем,

История вопроса: у меня есть отчет в CSV-файле, который мне ежедневно отправляют по электронной почте.Я пытаюсь создать скрипт в GAS, чтобы загрузить файл CSV в Google Drive, а затем загрузить его в таблицу BigQuery.GAS является единственным скриптовым инструментом, который мы включили, поэтому я застрял с ним.Я новичок как в JavaScript в целом, так и в API BigQuery

код:

function testFunction() {

  var file = DriveApp.getFilesByName("my_csv_file.csv")
  var csv = file.next().getBlob().setContentType('application/octet-stream').getDataAsString();
  var csvData = Utilities.parseCsv(csv);

  // I need to do the following to get the yyyy-MM-dd format

  for (var i = 1; i < csvData.length; i++) {
    var csvdate = csvData[i][1];
    csvData[i][1] = csvdate.substring(6, 10) + "-" + csvdate.substring(3, 5) + "-" + csvdate.substring(0, 2);
    }

  var csvString = csvData.join("\n");  

 var blob = Utilities.newBlob(csvString, "text/csv")
 var data = blob.setContentType('application/octet-stream');

  var projectId = 'my_project_id';
  var datasetId = 'my_dataset';
  var tableId   = 'bigquery_table';

  var job = {
    configuration: {
      load: {
        destinationTable: {
          projectId: projectId,
          datasetId: datasetId,
          tableId: tableId
        },
        source_format: 'CSV',
        skipLeadingRows: 1,
        allowJaggedRows: 'TRUE',
        allow_quoted_newlines: 'TRUE',
      }
    }
  };
  job = BigQuery.Jobs.insert(job, projectId, data);

}

И ошибка задания, которую я получаю:

Error encountered during job execution:
Error while reading data, error message: CSV table encountered too many errors, giving up. Rows: 1290; errors: 1. Please look into the errors[] collection for more details.
Failure details:
 - Error while reading data, error message: Too many values in row
   starting at position: 239165.
 - You are loading data without specifying data format, data will be
   treated as CSV format by default. If this is not what you mean,
   please specify data format by --source_format.

что я не понимаю: я указываю source_format - я делаю это неправильно?

Где я обнаружил проблему: слишком много значений в некоторых строках, потому что слишком много столбцов.Слишком много столбцов, потому что в некоторых описаниях продуктов есть запятые.В оригинальном файле CSV все ячейки заключены в кавычки - я думаю, это хороший способ обойти проблему.Дело в том, что мне нужно изменить формат столбца дня, чтобы BigQuery принимал его как дату, и, таким образом, я, кажется, стираю все кавычки ...

Любые указатели на то, как я могу исправитьэто, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Кажется, я нашел решение.Дополнительные запятые появляются только в одном столбце, поэтому я использовал этот цикл:

  for (var i = 1; i < csvData.length; i++) {
    var csvdate = csvData[i][1];
    csvData[i][1] = csvdate.substring(6, 10) + "-" + csvdate.substring(3, 5) + "-" + csvdate.substring(0, 2);
    }

, чтобы добавить дополнительный шаг:

  for (var i = 1; i < csvData.length; i++) {
    var csvdate = csvData[i][1];
    csvData[i][1] = csvdate.substring(6, 10) + "-" + csvdate.substring(3, 5) + "-" + csvdate.substring(0, 2);
    var csvdesc = csvData[i][4];
    csvData[i][4] = csvdesc.replace(/([,])+/g, "") ;
    }

, который удаляет все запятые из столбца.Уф!

0 голосов
/ 10 февраля 2019

В исходном файле CSV все ячейки заключены в кавычки

Затем сделайте то же самое.

var csvString = csvData.map(function (row){
    return '"' + row.join('","') + '"';
}).join('\n')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...