Photoshop JSX脚本:如何用原生JS读取固定路径CSV并转数组?
Photoshop JSX 读取本地CSV并转换为数组方案
1. 获取脚本同目录的CSV文件路径
在Photoshop JSX环境中,通过$.fileName可获取当前脚本的完整路径,结合File对象的parent属性就能得到脚本所在目录,再拼接CSV文件名即可生成目标文件的绝对路径:
// 获取脚本所在目录 const scriptDir = new File($.fileName).parent; // 拼接CSV文件路径(假设CSV名为data.csv,与脚本同目录) const csvFilePath = new File(scriptDir + "/data.csv");
2. 读取CSV文件内容
使用File对象的open()、read()方法读取文件内容,同时处理文件不存在的异常情况:
let csvContent = ""; if (csvFilePath.exists) { csvFilePath.open("r"); // 以只读模式打开文件 csvContent = csvFilePath.read(); // 读取全部文件内容 csvFilePath.close(); // 关闭文件流 } else { alert("指定的CSV文件不存在:" + csvFilePath.fsName); exit(); }
3. 解析CSV内容为二维数组
CSV解析需兼容带引号的单元格(比如单元格内容包含逗号),以下是原生JS实现的健壮解析逻辑:
function parseCSV(csvText) { const rows = []; const lines = csvText.split(/\r?\n/); // 兼容Windows和Unix换行符 // 匹配CSV单元格的正则,处理带引号的特殊情况 const regex = /("([^"]|"")*"|[^,]*)(,|$)/g; for (let line of lines) { if (line.trim() === "") continue; // 跳过空行 const row = []; let match; while ((match = regex.exec(line)) !== null) { let cell = match[1]; // 处理带引号的单元格:移除首尾引号,替换内部双引号为单引号 if (cell.startsWith('"') && cell.endsWith('"')) { cell = cell.slice(1, -1).replace(/""/g, '"'); } row.push(cell); // 匹配到最后一个单元格时退出循环 if (match[3] === "") break; } rows.push(row); } return rows; } // 调用解析函数,得到二维数组格式的CSV数据 const csvArray = parseCSV(csvContent);
4. 完整示例代码
// 获取脚本所在目录 const scriptDir = new File($.fileName).parent; // 拼接CSV文件路径 const csvFilePath = new File(scriptDir + "/data.csv"); let csvContent = ""; // 读取文件 if (csvFilePath.exists) { csvFilePath.open("r"); csvContent = csvFilePath.read(); csvFilePath.close(); } else { alert("CSV文件不存在:" + csvFilePath.fsName); exit(); } // CSV解析函数 function parseCSV(csvText) { const rows = []; const lines = csvText.split(/\r?\n/); const regex = /("([^"]|"")*"|[^,]*)(,|$)/g; for (let line of lines) { if (line.trim() === "") continue; const row = []; let match; while ((match = regex.exec(line)) !== null) { let cell = match[1]; if (cell.startsWith('"') && cell.endsWith('"')) { cell = cell.slice(1, -1).replace(/""/g, '"'); } row.push(cell); if (match[3] === "") break; } rows.push(row); } return rows; } // 转换为数组并提取数据示例 const csvData = parseCSV(csvContent); // 打印表头和第一行数据 alert("表头:" + csvData[0].join(", ")); if (csvData.length > 1) { alert("第一行数据:" + csvData[1].join(", ")); }
注意事项
- 确保CSV文件编码为UTF-8,避免乱码;若使用其他编码,可在
open()方法中指定编码,例如csvFilePath.open("r", "UTF-8") - 大体积CSV文件建议分批读取,避免内存占用过高
- 解析函数支持单元格内容包含逗号、换行(需用引号包裹换行内容)
内容的提问来源于stack exchange,提问作者Hao Phung
相关产品推荐
相关产品推荐

