csv - Google Apps Script Utilities.parseCsv() 更改小数和千位分隔符

标签 csv google-apps-script google-sheets

我是 GAS 新手,我正在努力解决我遇到的问题。 (我在网站上没有找到可以解决我的问题的类似问题,因此我提出了一个新问题)

目标:将 CSV 从 Google 云端硬盘导入 Google 表格
问题:
csv 文件中的货币为“1,000.57”--> 美国格式
我需要“1.000,57”的货币格式 --> 欧洲格式

目前,使用 Utilities.parseCsv() 时,格式会变得困惑,而且货币也完全错误。

问题:有没有办法把“,”改为“.”和 ”。”解析期间“,”?如果是这样,还会有进一步的问题吗,因为 csv 的分隔符也是“,”。

我已经在网络上找到了一些代码片段(不是我的代码:spreadsheet.dev 的 props)并尝试更改以下内容,但它似乎不起作用:

//Imports a CSV file in Google Drive into the Google Sheet
function importCSVFromDrive() {
  var fileName = promptUserForInput("Please enter the name of the CSV file to import from Google Drive:");
  var files = findFilesInDrive(fileName);
  if(files.length === 0) {
    displayToastAlert("No files with name \"" + fileName + "\" were found in Google Drive.");
    return;
  } else if(files.length > 1) {
    displayToastAlert("Multiple files with name " + fileName +" were found. This program does not support picking the right file yet.");
    return;
  }
  var file = files[0];
  var csvString = file.getBlob().getDataAsString()
  var escapedString = csvString.replace(",",".")
                                .replace(".",",");
  var contents = Utilities.parseCsv(escapedString);
  var sheetName = writeDataToSheet(contents);
  displayToastAlert("The CSV file was successfully imported into " + sheetName + ".");
}

//Prompts the user for input and returns their response
function promptUserForInput(promptText) {
  var ui = SpreadsheetApp.getUi();
  var prompt = ui.prompt(promptText);
  var response = prompt.getResponseText();
  return response;
}

//Returns files in Google Drive that have a certain name.
function findFilesInDrive(filename) {
  var files = DriveApp.getFilesByName(filename);
  var result = [];
  while(files.hasNext())
    result.push(files.next());
  return result;
}

//Inserts a new sheet and writes a 2D array of data in it
function writeDataToSheet(data) {
  var ss = SpreadsheetApp.getActive();
  sheet = ss.insertSheet();
  sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
  return sheet.getName();
}

我做错了什么?

最佳答案

您的 CSV 数据示例如下:https://drive.google.com/file/d/1ASevYOWtu8YL6YA4w-UqDuNXAS0RfaJF/view?usp=sharing

在我看来,它就像普通的 CSV 数据:

Trades,Header,DataDiscriminator,Asset Category,Currency,Symbol,Date/Time,Quantity,T.Price
Trades,Data,Order,Stocks,USD,ALGN,"2021-06-28,10:50:27",3,627.17,621.52,-1881.51,-1,1882.51,0,-16.95,O
Trades,Data,Order,Stocks,USD,AMAT,"2021-06-29,09:38:53",14,142.15,141.92,-1990.1,-1,1991.1,0,-3.22,O
Trades,Data,Order,Stocks,USD,APH,"2021-07-02,09:30:01",30,69.438,69.95,-2083.14,-1,2084.14,0,15.36,O

我没有看到任何“欧洲”格式的数字。

我相信它可以正确解析为:

<表类=“s-表”> <标题> 交易 标题 数据鉴别器 Assets 类别 货币 符号 日期/时间 数量 价格 <正文> 交易 数据 订单 股票 美元 ALGN “2021-06-28,10:50:27” 3 627.17 621.52 -1881.51 -1 1882.51 0 -16.95 O 交易 数据 订单 股票 美元 AMAT “2021-06-29,09:38:53” 14 142.15 141.92 -1990.1 -1 1991.1 0 -3.22 O 交易 数据 订单 股票 美元 APH “2021-07-02,09:30:01” 30 69.438 69.95 -2083.14 -1 2084.14 0 15.36 O

我还没有尝试过使用 Utilities.parseCsv() 来做到这一点,我编写了自己的小型 csv 解析器,只是为了确保该任务是可行的并且我的假设是正确的:

var s = `Trades,Header,DataDiscriminator,Asset Category,Currency,Symbol,Date/Time,Quantity,T.Price
Trades,Data,Order,Stocks,USD,ALGN,"2021-06-28,10:50:27",3,627.17,621.52,-1881.51,-1,1882.51,0,-16.95,O
Trades,Data,Order,Stocks,USD,AMAT,"2021-06-29,09:38:53",14,142.15,141.92,-1990.1,-1,1991.1,0,-3.22,O
Trades,Data,Order,Stocks,USD,APH,"2021-07-02,09:30:01",30,69.438,69.95,-2083.14,-1,2084.14,0,15.36,O`;

// replace ',' with '_' inside quotes
s.match(/("[^,]+),(.+")/g).forEach(t=>s=s.split(t).join(t.replace(/,/g,'_')));

// replace ',' with '\t', replace '_' with ',' and split string into 2-d array
var array = s.replace(/,/g,"\t").replace(/_/g,',').split('\n').map(x => x.split('\t'));

console.table(array);

输出:

┌─────────┬──────────┬──────────┬─────────────────────┬──────────────────┬────────────┬──────────┬─────────────────────────┬────────────┬───────────┬──────────┬────────────┬──────┬───────────┬─────┬──────────┬─────┐
│ (index) │    0     │    1     │          2          │        3         │     4      │    5     │            6            │     7      │     8     │    9     │     10     │  11  │    12     │ 13  │    14    │ 15  │
├─────────┼──────────┼──────────┼─────────────────────┼──────────────────┼────────────┼──────────┼─────────────────────────┼────────────┼───────────┼──────────┼────────────┼──────┼───────────┼─────┼──────────┼─────┤
│    0    │ 'Trades' │ 'Header' │ 'DataDiscriminator' │ 'Asset Category' │ 'Currency' │ 'Symbol' │       'Date/Time'       │ 'Quantity' │ 'T.Price' │          │            │      │           │     │          │     │
│    1    │ 'Trades' │  'Data'  │       'Order'       │     'Stocks'     │   'USD'    │  'ALGN'  │ '"2021-06-28,10:50:27"' │    '3'     │ '627.17'  │ '621.52' │ '-1881.51' │ '-1' │ '1882.51' │ '0' │ '-16.95' │ 'O' │
│    2    │ 'Trades' │  'Data'  │       'Order'       │     'Stocks'     │   'USD'    │  'AMAT'  │ '"2021-06-29,09:38:53"' │    '14'    │ '142.15'  │ '141.92' │ '-1990.1'  │ '-1' │ '1991.1'  │ '0' │ '-3.22'  │ 'O' │
│    3    │ 'Trades' │  'Data'  │       'Order'       │     'Stocks'     │   'USD'    │  'APH'   │ '"2021-07-02,09:30:01"' │    '30'    │ '69.438'  │ '69.95'  │ '-2083.14' │ '-1' │ '2084.14' │ '0' │ '15.36'  │ 'O' │
└─────────┴──────────┴──────────┴─────────────────────┴──────────────────┴────────────┴──────────┴─────────────────────────┴────────────┴───────────┴──────────┴────────────┴──────┴───────────┴─────┴──────────┴─────┘

如果添加 range.setValues(array)而不是console.table(array)您可能会在工作表中得到一个合适的表格。

更新

替换123.45 --> 123,45在数组中,您需要在末尾添加一行:

array = array.map(row => row.map(cell => cell.replace(/(\d)\.(\d)/g, '$1,$2')));

关于csv - Google Apps Script Utilities.parseCsv() 更改小数和千位分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68482496/

相关文章:

python - 在 Python 中获取字符串和 csv 文件的正确编码

javascript - Google Scripts - 从退回的邮件中获取电子邮件地址并解析信息

javascript - 如何从附加组件中轮询 Google 文档

arrays - 将 JSON 数组输出打印到 Google Sheet

javascript - 发送电子邮件正确的触发设置

java - Java 中的 CSV 解析 - 工作示例..?

javascript - 带 Y 值跟踪的 D3.js 多系列图表

excel - 跳过 "reading"之前的 6 行进入电源查询

javascript - 单独的 css 和 javascript 的谷歌示例失败

javascript - 在循环内向数组添加元素