You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac Script Editor中用JXA解析CSV文件,如何剔除RTF格式信息?

解决JXA读取CSV文件时混入RTF格式的问题

在Mac的Script Editor中使用JXA(JavaScript for Automation)解析CSV文件为数组时,出现结果包含RTF格式信息而非纯文本的问题。

原代码

var editor = Application.currentApplication();
editor.includeStandardAdditions = true;

function readAndSplitFile(file, delimiter) {
  var fileString = file.toString();
  return editor.read(Path(fileString), { usingDelimiter: delimiter });
}

var file = editor.chooseFile({
ofType: "csv",
withPrompt: "Please select a csv file:"
})

readAndSplitFile(file, ",")

当前错误结果

CSV文件实际内容为dog, cat, pig, mouse,但执行代码后得到带RTF格式的数组:

["{\\rtf1\\ansi\\ansicpg1252\\cocoartf2578
\\cocoatextscaling0\\cocoaplatform0{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}
{\\colortbl;\\red255\\green255\\blue255;}
{\\*\\expandedcolortbl;;}
\\margl1440\\margr1440\\vieww12540\\viewh9620\\viewkind0
\\pard\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\pardirnatural\\partightenfactor0

\\f0\\fs24 \\cf0 dog", " cat", " pig", " mouse}"]

解决方案

问题根源是目标文件虽后缀为CSV,但实际存储为RTF格式。需要先将RTF内容转换为纯文本,再分割成数组。以下是两种可行方案:

方案1:正则清理RTF格式(简单场景适用)

直接读取文本后用正则去除RTF标记,再分割处理:

var app = Application.currentApplication();
app.includeStandardAdditions = true;

function readAndSplitFile(file, delimiter) {
    // 读取纯文本内容
    var rawText = app.read(file, { as: "text" });
    // 去除RTF标记、首尾空格,再分割并清理每个元素的空格
    var plainText = rawText.trim().replace(/^\{\\rtf.*?\\cf0 /, '').replace(/\}$/, '');
    return plainText.split(delimiter).map(item => item.trim());
}

var file = app.chooseFile({
    ofType: "csv",
    withPrompt: "请选择CSV文件:"
});

readAndSplitFile(file, ",");

方案2:用Objective-C桥接转换RTF(通用可靠)

通过JXA调用Objective-C的NSAttributedString将RTF转换为纯文本,兼容性更好:

var app = Application.currentApplication();
app.includeStandardAdditions = true;

// 将RTF文件内容转换为纯文本
function rtfToPlainText(filePath) {
    var NSString = $.NSString;
    var fileData = NSString.stringWithContentsOfFileEncodingError(filePath, $.NSUTF8StringEncoding, null);
    var attrString = $.NSAttributedString.alloc.initWithRTFDocumentAttributesError(fileData, null, null);
    return attrString.string.js;
}

function readAndSplitFile(file, delimiter) {
    var plainText = rtfToPlainText(file.toString());
    // 分割后清理每个元素的多余空格
    return plainText.trim().split(delimiter).map(item => item.trim());
}

var file = app.chooseFile({
    ofType: "csv",
    withPrompt: "请选择CSV文件:"
});

readAndSplitFile(file, ",");

执行上述代码后,即可得到纯文本数组:["dog", "cat", "pig", "mouse"]

内容的提问来源于stack exchange,提问作者user3080392

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:57:10