雜記 › 技術筆記 › 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 27760000 個像素零差異、體積漲到 15.881 倍:JPG 轉 PNG 的三層位元組帳 2026-10-28 整個資料夾拖進來,候選池只多了 1 個名字:檔案隨機抽取讀不到目錄裡的 2558 個檔案 2026-10-28