通过 google 处理换行符的脚本另存为 CSV
Saving as CSV through google script handling newline characters
所以我尝试从 Google Spreadsheet 中获取 sheet 并将其保存为 .CSV 文件,就像您可以手动执行的那样。它工作得相当好,但我 运行 遇到了新的 lines/line feeds/carriage returns 等问题。我使用并修改了 Google's solution 和一些堆栈到目前为止满足我需求的溢出资源,但是我陷入了这个新行问题。
问题:
原因:
我会注意到,如果我手动保存来自 Google Spreadsheets 的 CSV 文件,它看起来不错,但你在原因图片中看到的那个框是我无法解决的问题。
我当前的代码:
function convertRangeToCsvFile_(csvFileName, sheet) {
// get available data range in the spreadsheet
var activeRange = sheet.getDataRange();
try {
var data = activeRange.getValues();
var csvFile = undefined;
// loop through the data in the range and build a string with the csv data
if (data.length > 1) {
var csv = "";
for (var row = 0; row < data.length; row++) {
for (var col = 0; col < data[row].length; col++) {
//Handle special characters
var text = data[row][col].toString();
text = text.replace(/(\r\n|\n|\r)/g," ");
for(var i = 0; i < text.length; i++)
{
if(text[i] == "\'" || text[i] == "\"" || text[i] == "\" || text[i] == "\n" || text[i] == "\r" || text[i] == "\t" || text[i] == "\b" || text[i] == "\f")
{
text = spliceSlice(text,i,0,"\");
i++;
}
}
if (data[row][col].toString().indexOf(",") != -1) {
data[row][col] = "\"" + text + "\""; //Puts quotes around the data for strings.
}
}
// join each row's columns
// add a carriage return to end of each row, except for the last one
if (row < data.length-1) {
csv += data[row].join(",") + "\r\n";
}
else {
csv += data[row];
}
}
}
csvFile = csv;
return csvFile;
}
catch(err) {
Logger.log(err);
}
}
如您所见,我正在尝试使用我阅读的有关 'regex expressions' 的内容来处理新行,但是,它们似乎实际上并没有为我做任何事情。所以也许我只是用错了它然后它会起作用,或者我需要以不同的方式处理这个问题。
编辑: 我查看了 Notepad++ 中的文件并确定它们是导致行中间问题的 LF 字符。我的行尾 \r\n 工作正常。
而不是 .replace(/(\r\n|\n|\r)/g," ")
尝试 .replace("\n", " ").replace("\r", " ")
,我知道它本质上是一样的,但我目前正在使用这个解决方案,没有打嗝。
这是一个老问题,但我 运行 在我的 Google 搜索的顶部进入它,当时我只是在寻找一个简单的解决方案来处理从表格导出的 CSV 文件中的换行符。
由于现在是 2022 年,您可以使用表格的非常强大的查找 + 替换来定位所有换行符(删除它们,或将它们替换为文字 \n
字符串等)。然后您可以正常导出为 CSV。
在我这里的示例中,“替换为”不使用正则表达式,只有搜索使用正则表达式,所以我想在导出之前保留此处的换行符。
所以我尝试从 Google Spreadsheet 中获取 sheet 并将其保存为 .CSV 文件,就像您可以手动执行的那样。它工作得相当好,但我 运行 遇到了新的 lines/line feeds/carriage returns 等问题。我使用并修改了 Google's solution 和一些堆栈到目前为止满足我需求的溢出资源,但是我陷入了这个新行问题。
问题:
原因:
我会注意到,如果我手动保存来自 Google Spreadsheets 的 CSV 文件,它看起来不错,但你在原因图片中看到的那个框是我无法解决的问题。
我当前的代码:
function convertRangeToCsvFile_(csvFileName, sheet) {
// get available data range in the spreadsheet
var activeRange = sheet.getDataRange();
try {
var data = activeRange.getValues();
var csvFile = undefined;
// loop through the data in the range and build a string with the csv data
if (data.length > 1) {
var csv = "";
for (var row = 0; row < data.length; row++) {
for (var col = 0; col < data[row].length; col++) {
//Handle special characters
var text = data[row][col].toString();
text = text.replace(/(\r\n|\n|\r)/g," ");
for(var i = 0; i < text.length; i++)
{
if(text[i] == "\'" || text[i] == "\"" || text[i] == "\" || text[i] == "\n" || text[i] == "\r" || text[i] == "\t" || text[i] == "\b" || text[i] == "\f")
{
text = spliceSlice(text,i,0,"\");
i++;
}
}
if (data[row][col].toString().indexOf(",") != -1) {
data[row][col] = "\"" + text + "\""; //Puts quotes around the data for strings.
}
}
// join each row's columns
// add a carriage return to end of each row, except for the last one
if (row < data.length-1) {
csv += data[row].join(",") + "\r\n";
}
else {
csv += data[row];
}
}
}
csvFile = csv;
return csvFile;
}
catch(err) {
Logger.log(err);
}
}
如您所见,我正在尝试使用我阅读的有关 'regex expressions' 的内容来处理新行,但是,它们似乎实际上并没有为我做任何事情。所以也许我只是用错了它然后它会起作用,或者我需要以不同的方式处理这个问题。
编辑: 我查看了 Notepad++ 中的文件并确定它们是导致行中间问题的 LF 字符。我的行尾 \r\n 工作正常。
而不是 .replace(/(\r\n|\n|\r)/g," ")
尝试 .replace("\n", " ").replace("\r", " ")
,我知道它本质上是一样的,但我目前正在使用这个解决方案,没有打嗝。
这是一个老问题,但我 运行 在我的 Google 搜索的顶部进入它,当时我只是在寻找一个简单的解决方案来处理从表格导出的 CSV 文件中的换行符。
由于现在是 2022 年,您可以使用表格的非常强大的查找 + 替换来定位所有换行符(删除它们,或将它们替换为文字 \n
字符串等)。然后您可以正常导出为 CSV。
在我这里的示例中,“替换为”不使用正则表达式,只有搜索使用正则表达式,所以我想在导出之前保留此处的换行符。