从资源管理器里选中一批文件、复制成一行一个名字的清单,再让「名字」和「后缀」各占一列,听起来是三步就完的事。我拿 20 行清单跑了一遍,页面上只剩 18 行;复制出来的文本粘进 Excel 还是 18 行 × 1 列;手动走一次「数据→分列」之后,格子里原来的 1e5 变成了 100000。这篇记的就是我把这条链子每一段都量完之后看到的口径,重点是列结构与分隔符。
切分这一步只做一件事:每一行从最后一个点断开,左边进左列、右边进右列,中间用一个分隔符连起来。我用的就是文件名后缀拆分,它同时给出页面上的表格和一段可直接复制的纯文本。双后缀像 archive.tar.gz 也只在最后一个点处断一次,得到 archive.tar 与 gz。
20 行进、18 行出,少掉的行不补位
我这份样例里混进 1 个空行和 1 个只含空格的行。模板第 93 行有 if (!trimmed) return;,这两种行在切分之前就被丢掉,既不进表格,也不进剪贴板,更不会留一个空位让行号对上。于是行数差恰好等于空白行数:20 行进、18 行出,页面数到 <tr> 18 个、<td> 54 个。
顺序倒是不动。模板里 .sort( 与 .reverse( 各 0 处,我拿 500 行乱序清单跑完逐行比对,orderDiff 为 0。但只要输入里有空白行,输出就没法和原清单逐行对齐,错位从被丢掉那一行就开始了。
图 1 20 行进、18 行出:少的 2 行是空行与空格行
一行变成两列的对照
| 输入行 | 左列 | 右列 |
|---|---|---|
report.pdf | report | |
archive.tar.gz | archive.tar | gz |
LICENSE | LICENSE | 空串 |
my report .pdf | my report ,尾随空格还在 | |
C:\a b\photo.jpg | C:\a b\photo | jpg |
| (空行) | 整行丢弃,不补位 | |
带路径那行只是把左段整段带进列里,盘符、反斜杠、空格原样留着;至于怎么从路径里取出文件名,只要文件名不要路径那篇已经写过,这里不重复。
分隔符实测只有两个码位
剪贴板里 20 行样例的产物共 459 个码位、467 个 UTF-8 字节,差的 8 字节来自 4 个中文名字。逐字符数下来:逗号 18 个、LF 17 个、Tab 0 个、CR 0 个、竖线 0 个,末尾不补换行。逗号是 U+002C,换行是 U+000A,没有第三种分隔符可挑。
粘进 Excel:逗号不会自己分列
本机 Microsoft Excel 12.0 的 COM 实测:把这 18 行直接粘进去是 18 行 × 1 列,每格都是 String,逗号只是格内的一个字符,反斜杠与空格也照原样待着。想拆成两列得我自己执行「数据→分列→逗号」,这一步不是工具给的;分列后正好 18 行 × 2 列。
另一份 15 行的清单更能说明问题:直接粘贴 15 行 × 1 列,手动分列后是 15 行 × 3 列。多出来那一列不是故障,是名字里本来就带逗号——a,b.txt 输出 3 段,Excel 就撑成 3 列。
1e5变 100000,科学计数法被当成一个数读掉。007变 7,前导零消失。1.0变 1,尾随零消失。12.3被拆成 12 和 3 两格。2024-01-01变日期序列 45292,3-4变 46085。20240101这种无后缀的纯数字左段被读成数值,不再是文本。
图 2 15 行文本在 Excel 里的列数与类型变化
预设成文本格式也拦不住
我原本以为先设好格式就能保住原值:把接收区两列预设成文本「@」再分列。实测 45292、12、7、1、46085、20240101、0.1 全部还是 Double,NumberFormat 被改写回 m/d/yyyy,15 格里只有 1e5 保住 String。另一条通道是把分隔符换成 U+0009 再直接粘贴:会自动分成 15 行 × 3 列,1e5 与 007 在这里保住 String,但 2024-01-01 同样变 45292。
无后缀那行的右段是空串
20 行样例的统计条写着总文件数 18、有后缀 14、无后缀 4。无后缀的行复制出来是 LICENSE,,逗号结尾、右段是空串;分列后那一格在 Excel 里是 null,不是 0,也不是占位符。页面上看着像占位符的 —(U+2014)只属于第三列的显示,剪贴板里没有它,粘出去不会带上。
三种换行的分行结果
LF 与 CRLF 都能正常分行,a.txt\r\nb.txt\r\nc.txt\r\n 出来 3 行,有无尾换行不影响行数。只有 CR 的老 Mac 文本不分行:a.txt\rb.txt\rc.txt 塌成 1 行,两个 U+000D 一起落进左段被复制出去。
页面的对照列是现拼的
第三列不是我的原始输入行,而是模板第 108 行用 name + '.' + ext 现拼回去的。20 行样例里拼回后与原文不等的有 5 行。最典型的是 my report .pdf:点前的尾随空格留在左段,浏览器 textContent 保留它,innerText 会折叠掉——表格上看不见,Excel 里还在。
行数多了会不会截断
headless Chrome 里 500 / 2000 / 20000 行分别耗 9 / 21 / 193.9 ms,<td> 是 1500 / 6000 / 60000 个;20000 行那次 tbody 的 innerHTML 长 1803495 字符、文档节点 100031。Node 端 50000 行 245.12 ms,剪贴板 717460 字节。四档都是 truncated=false,没有哪一档被裁。
字节账也自洽:2000 行 × 255 字符的输入 511999 字节,输出同样是 511999 字节,逐字节相等——点被逗号一比一顶替,长度不会变。
常见问题
Q:粘进 Excel 为什么只有一列?
出口是逗号,而 Excel 对粘贴进来的纯文本不按逗号拆。直接粘贴实测 18 行 × 1 列,得自己执行分列;换成制表符那条通道才会自动拆。
Q:输出行数为什么比清单少?
空行与纯空格行被丢弃且不补位,20 行输入对应 18 行输出。想让行号对上,只能在输入前把那两类行剔掉或补成有内容的一行。
Q:能导出文件而不是复制吗?
不能。模板内 download、Blob、createObjectURL 各 0 命中,UU.copy 走 navigator.clipboard.writeText 输出单格式 text/plain,所以「复制与下载是否逐字节一致」这个问题没有第二份产物可比。