杂记 › 技术笔记 › 20 行文件名拆成 18 行两列:粘进 Excel 只占 1 列,1e5 变成 100000

20 行文件名拆成 18 行两列:粘进 Excel 只占 1 列,1e5 变成 100000

从资源管理器里选中一批文件、复制成一行一个名字的清单,再让「名字」和「后缀」各占一列,听起来是三步就完的事。我拿 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。但只要输入里有空白行,输出就没法和原清单逐行对齐,错位从被丢掉那一行就开始了。

行数从输入到输出的流失输入 20 行全量输出 18 行两列文本丢弃 2 行空行加空格行

图 1 20 行进、18 行出:少的 2 行是空行与空格行

一行变成两列的对照

输入行左列右列
report.pdfreportpdf
archive.tar.gzarchive.targz
LICENSELICENSE空串
my report .pdfmy report ,尾随空格还在pdf
C:\a b\photo.jpgC:\a b\photojpg
(空行)整行丢弃,不补位

带路径那行只是把左段整段带进列里,盘符、反斜杠、空格原样留着;至于怎么从路径里取出文件名,只要文件名不要路径那篇已经写过,这里不重复。

分隔符实测只有两个码位

剪贴板里 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 这种无后缀的纯数字左段被读成数值,不再是文本。
同一份文本进 Excel 的三种形态直接粘贴 1 列手动分列 3 列数字被改写换成 Tab 直贴自动 3 列,日期照旧

图 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,所以「复制与下载是否逐字节一致」这个问题没有第二份产物可比。

📎 相关文章

文本对比的代价全在 (m+1)×(n+1) 这张表:6000 行还能跑,8000 行直接堆内存崩 2026-10-28 10 万个键全进 DOM:JSON 视图的渲染规模、爆栈深度与复制重排 2026-10-28 带 g 的正则是有状态的:同一个 RegExp 连打 4 次 test 只过 2 个 2026-10-28 JPG 转 PNG:27760000 个像素一位没变、体积涨到 15.881 倍,JPEG 的块效应被原样锁进无损容器 2026-10-28 拖进去一整个文件夹,候选池只多了 1 个名字:文件随机抽取读不到目录里的 2558 个文件 2026-10-28