Solusi solusi untuk Pengecualian Skrip Aplikasi Google: FILENAME.csv melebihi ukuran file maksimal?

Saya sedang membangun aplikasi Google App Maker yang menggunakan file spreadsheet Excel CSV yang diunggah pengguna sebagai masukan. Saya telah memikirkan beberapa solusi yang mungkin untuk membaca data dari file ini, tetapi saya mengalami kesalahan ini: "Pengecualian: FILENAME.csv melebihi ukuran file maksimum" setiap kali. Saya telah mencoba mengekstraksi data melalui parseCSV() ke Google Cloud SQL, membaca sebagai satu string melalui .getBlob().getDataAsString() dan membaginya dengan "\n," dan menulis semua data ke Google Dokumen dan mencoba membaca itu dari sana. Namun, semua metode ini menghasilkan kesalahan yang sama.

Apakah ada solusi untuk mengatasi masalah ukuran file maksimum ini?

Saya telah berpikir untuk membagi file menjadi file CSV yang lebih kecil, tetapi saya tidak yakin bagaimana cara melakukannya.


person Eric    schedule 25.06.2018    source sumber
comment
Bisakah Anda memberikan informasi tentang ukuran file dan jumlah baris file CSV Anda?   -  person Tanaike    schedule 26.06.2018
comment
@Tanaike File saya berukuran 56,5 MB. File CSV Excel memiliki 16 kolom dan 370.573 baris.   -  person Eric    schedule 26.06.2018


Jawaban (1)


Anda ingin mengonversi file CSV besar ke Spreadsheet terpisah. Jika pemahaman saya benar, bagaimana dengan solusi ini?

Masalah dan solusi untuk situasi ini:

  1. Ketika file CSV sebesar itu dikonversi ke Spreadsheet, file tersebut tidak dapat langsung dikonversi ke Spreadsheet, karena jumlah total sel dan ukuran file. Dan juga ketika file berukuran besar dicoba untuk dipecah, tidak dapat dilakukan karena blob yang dapat digunakan di GAS kurang dari 50 MB (52.428.800 bytes).

    • In order to split such large file, it uses "Partial download" of files.get in Drive API.
  2. Di lingkungan saya, ketika file CSV berukuran 100 MB digunakan untuk contoh skrip ini, ketika file dibagi menjadi 10 MB, diperlukan waktu sekitar 65 detik untuk mengonversi potongan menjadi Spreadsheet. Dalam hal ini, ketika file CSV dikonversi sepenuhnya, dianggap sudah melebihi batas waktu (6 menit) untuk mengeksekusi GAS.

    • In order to avoid this, it is required to implement the resumable conversion from the large CSV-file to several spreadsheets.

Mempersiapkan :

Untuk menggunakan contoh skrip ini, aktifkan Drive API di Layanan Google Lanjutan dan konsol API.

Aktifkan Drive API v2 di Layanan Google Tingkat Lanjut

  • On script editor
    • Resources -> Advanced Google Services
    • Aktifkan Drive API v2

Aktifkan Drive API di konsol API

  • On script editor
    • Resources -> Cloud Platform project
    • Lihat konsol API
    • Di Memulai, klik Aktifkan API dan dapatkan kredensial seperti kunci.
    • Di sisi kiri, klik Perpustakaan.
    • Di Penelusuran API & layanan, masukkan "Drive". Dan klik Drive API.
    • Klik tombol Aktifkan.
    • Jika API sudah diaktifkan, mohon jangan dimatikan.

Contoh skrip:

function createSplitSpreadsheet(obj) {
  var accessToken = ScriptApp.getOAuthToken();
  var baseUrl = "https://www.googleapis.com/drive/v3/files/";

  // Retrieve file size.
  var url1 = baseUrl + obj.fileId + "?fields=size";
  var params1 = {
    method: "get",
    headers: {Authorization: "Bearer " + accessToken},
  };
  var fileSize = Number(JSON.parse(UrlFetchApp.fetch(url1, {headers: {Authorization: "Bearer " + accessToken}}).getContentText()).size);

  // Calculate number of output files.
  if (obj.files == null) {
    obj.number = 1;
    obj.start = 0;
  }
  var start = obj.start;
  var end = start + obj.chunk;
  var useFileSize = fileSize - start;
  f = Math.floor(useFileSize / obj.chunk);
  f = useFileSize % obj.chunk > 0 ? f + 1 : f;
  if (f < obj.files || obj.files == null) {
    obj.files = f;
  }

  // Split large file by chunk size (bytes).
  var url2 = baseUrl + obj.fileId + "?alt=media";
  var i;
  for (i = 0; i < obj.files; i++) {
    var params = {
      method: "get",
      headers: {
        Authorization: "Bearer " + accessToken,
        Range: "bytes=" + start + "-" + end,
      },
    };
    var res = UrlFetchApp.fetch(url2, params).getContentText();
    var e = res.lastIndexOf("\n");
    start += e + 1;
    end = start + obj.chunk;
    Drive.Files.insert(
      {mimeType: MimeType.GOOGLE_SHEETS, title: obj.fileName + (i + obj.number)},
      Utilities.newBlob(res.substr(0, e), MimeType.CSV)
    );
  }

  // Return next start value if there is a next chunk for the resume.
  if (start < fileSize) {
    return {nextStart: start, nextNumber: i + obj.number};
  } else {
    return null;
  }
}

// Please run this function.
function main() {
    var obj = {
        fileId: "#####", // File ID of the large CSV file.
        chunk: 10485760, // 10MB Please modify this for your situation.
        files: 3, // Please input the number of files you want to convert.
        start: 0,
        fileName: "sample",
        number: 1, // Counter of output files. Please input this as a next number.
    };
    var nextStart = createSplitSpreadsheet(obj);
    Logger.log(nextStart);
}

Penggunaan :

Saat Anda menggunakan ini, harap ubah obj di main() sesuai situasi Anda, dan jalankan main(). Contoh kasusnya adalah sebagai berikut.

Diperkirakan sebagai berikut.

  • Anda ingin mengonversi file CSV berukuran 100 MB menjadi 10 spreadsheet.
  • Ukuran satu potongan adalah 10 MB.
  • File CSV diproses setiap 3.

Dalam contoh kasus ini, setiap obj adalah sebagai berikut. Silakan masukkan setiap obj pada setiap proses.

  1. var obj = {fileId: "#####", chunk: 10485760, files: 3, start: 0, fileName: "sample", number: 1}
    • {"nextStart": ### nextStart2 ###, "nextNumber": 4} is returned from createSplitSpreadsheet().
  2. var obj = {fileId: "#####", chunk: 10485760, files: 3, start: ### nextStart2 ###, fileName: "sample", number: 4}
    • {"nextStart": ### nextStart3 ###, "nextNumber": 7} is returned from createSplitSpreadsheet().
  3. var obj = {fileId: "#####", chunk: 10485760, files: 3, start: ### nextStart3 ###, fileName: "sample", number: 7}
    • {"nextStart": ### nextStart4 ###, "nextNumber": 10} is returned from createSplitSpreadsheet().
  4. var obj = {fileId: "#####", chunk: 10485760, files: 3, start: ### nextStart4 ###, fileName: "sample", number: 10}
    • null is returned from createSplitSpreadsheet().

Dengan alur ini, 10 spreadsheet dibuat dari file CSV berukuran 100 MB.

Jika null digunakan untuk files di obj, files dihitung secara otomatis. Namun dalam kasus ini, batasan waktu pelaksanaan GAS mungkin telah berakhir. Harap berhati-hati dalam hal ini.

Referensi :

Jika ini bukan yang Anda inginkan, saya minta maaf.

person Tanaike    schedule 26.06.2018