從檔案總管裡選中一批檔案、複製成一行一個名稱的清單,再讓「名稱」和「後綴」各佔一列,聽起來是三步就完的事。我拿 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,所以「複製與匯出是否逐位元組一致」這個問題沒有第二份產物可比。