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
相关产品推荐
相关产品推荐

