ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CSV中身份证号变科学计数法?Excel导入与文本格式处理全攻略

CSV中身份证号变科学计数法?Excel导入与文本格式处理全攻略 如果你导出过带身份证号的CSV大概率经历过这种崩溃瞬间双击文件Excel打开身份证列变成一长串1.23E17编辑栏里后三位还全是0。更崩溃的是你还没反应过来手一抖按了保存原始CSV也被覆盖了。这个坑跟CSV本身没关系跟身份证号也没关系纯粹是Excel对长数字的特殊“待遇”。我踩过几次坑之后把各种解法都试了一遍从导入向导到源头加前缀从Mac版到WPS基本能做到让身份证号在任何版本里都正常显示。这篇文章就是一套完整的避坑手册适合所有需要处理CSV长数字字段的人——不管你是做人事、财务、运营还是写代码的工程师里面的方案都有你能直接抄的那一种。先声明一句身份证号属于敏感个人信息日常处理务必做好脱敏和权限控制不要随意在公网渠道传播。下面聊的是技术处理手段不是让你拿去搞数据泄露的。1. 先搞明白Excel为什么非要把18位数字“弄丢”3位1.1 Excel的15位精度红线想解决问题先得知道Excel为什么要“作妖”。Excel内部数值统一用双精度浮点数存储这种格式的有效数字精度只有15位——严格说是IEEE 754双精度格式十进制有效位数大约15到17位Excel为了保证显示一致性把有效位数收紧到了15位。而公民身份号码是18位前17位是本体码最后一位校验码远超Excel的精度上限。当Excel把一个18位数字当数值存下来的时候超出15位的部分会被截断剩下的低位直接补0。你可以自己做个实验在任意Excel单元格里敲一个18位数字比如123456789012345678回车后单元格会立刻变成1.23457E17这种科学计数法。点进编辑栏你会看到实际存储的数值已经变成了123456789012345000。这就是精度被截断的样子肉眼可见的后三位归零。总之只要Excel把身份证号当成“数字”而不是“文本”截断就必然发生。这是存储层面的问题不是显示层面的问题。1.2 一旦被截断保存后基本救不回来这里最大的坑其实不是显示成1.23E17而是后三位真的变成了0。那三位不是被隐藏了是被精度截断了。Excel里没有任何公式能把丢失的低位还原出来因为内存里存的就是一个不完整的数据不是完整数据的另一种表现形式。更麻烦的是操作习惯。很多人双击打开CSV看到乱码后第一反应是顺手CtrlS保存结果直接把原始CSV覆盖了。等你反应过来要重新处理原始数据已经变成了Excel里那份“残缺版”。我遇到过不止一次了运营同学导出活动报名名单打开后发现身份证坏了顺手点了保存再找人要源文件来回折腾半天。所以我养成一个习惯任何CSV导入Excel后先别急着保存。第一步永远是检查身份证列、手机号列、订单号列这些长数字字段确认没有精度丢失再考虑存盘。判断是否被截断的方法很简单点中单元格看编辑栏。如果显示的是后面一串0的整数说明数据已经坏了如果还能看到完整号码说明还没发生不可逆的精度丢失赶紧用导入方法处理。1.3 解决思路本质上只有两条路理解了原理解题思路就清晰了。CSV本身是个纯文本文件里面存的只有字符和逗号分隔符没有任何“这一列是文本还是数字”的元信息。数据会不会被截断完全取决于打开它的程序怎么猜类型。Excel默认策略是“看起来像数字就按数字处理”于是18位身份证中招。要改变这个结局只有两条路可走第一条路换个打开方式。不让Excel走默认的“自动类型推断”而是用数据导入向导在导入时明确告诉Excel“这一列请按文本处理”。第二条路在CSV内容上动手脚。在导出阶段就给身份证字段加一个前导制表符或其他标记让Excel自动推断时认为“这不是纯数字”从而按文本处理。两条路各有适用场景。处理别人给你的现成CSV用第一条路自己写脚本、写SQL、做系统导出强烈建议用第二条路因为可以从根源上解决问题交付给任何人都不怕。2. 最稳的方法用Excel的数据导入功能别直接双击先说结论直接双击打开CSV无论在新版还是老版Excel里都会触发自动类型转换十有八九要出问题。最稳妥的方式永远是先建一个空白工作表再用“数据”选项卡里的导入功能把CSV装进来每一列的数据类型都自己说了算。2.1 新版Excel的“从文本/CSV”导入完整流程如果你是Excel 2016之后或者Microsoft 365的用户完整操作路径是这样的打开一个空白Excel工作表或者新建一个工作簿。点击“数据”选项卡找到“获取数据”按钮。依次选择“自文件”→“从文本/CSV”。在弹出的选择框里找到CSV文件选定后点“导入”。Excel会打开一个Power Query预览窗口列表里会显示这个CSV的前几行和自动识别的列类型。在预览表里找到身份证那一列点击列标题左侧的类型图标把它改成“文本”。改完确认其他列也没问题点窗口右下角的“加载”按钮数据就带着你指定的类型进入表格了。关键就在第6步。只要你把身份证列手动指定成“文本”Power Query会老老实实按文本导入后三位绝对不会丢。这里有个细节预览窗口里列标题左侧如果显示的是“1.2E17”或者一个“123”样子的图标说明它自动识别成了数字你需要点那个图标在弹出的菜单里选择“文本”。如果预览列表里已经显示成了科学计数法也别慌改成文本之后重新加载就会恢复成原始字符串。2.2 老版本Excel的文本导入向导和分列补救如果你的Excel版本比较老界面里没有“获取数据”但有“自文本”入口。点击数据选项卡里的“自文本”选择文件后会进入一个老式的三步导入向导。第一步让你选择分隔符号一般勾选“逗号”第二步让你预览数据检查列边界第三步最关键在“列数据格式”区域先在预览框里选中身份证那一列列会变黑然后勾选“文本”最后点“完成”。这一步的顺序千万别弄反你必须先选中列再选格式否则格式设置不会生效。如果你已经双击打开了CSV发现身份证列已经变成科学计数法还有没有补救机会分情况。第一种情况你点进编辑栏看到后三位已经是000比如123456789012345000。这种情况下数据已经彻底损坏了分列也救不回来唯一办法是回源系统重新导出或者从原始数据库里再查一遍。第二种情况你看到的是完整的18位号码只是显示成了科学计数法。这在某些较短的数字上比较常见比如15位左右的订单号。这时候可以原地补救选中整列点“数据”选项卡里的“分列”前两步默认不变在第三步选中该列并选择“文本”点完成。整列会重新解析成文本显示恢复正常。但再强调一遍如果三位已经变成000分列没有任何作用。别在已经坏掉的数据上浪费时间赶紧找回源头。2.3 改扩展名法逼Excel乖乖走导入流程还有一个土办法有时候特别好用把CSV的文件扩展名从.csv改成.txt然后在Excel里用“数据→自文本”导入。因为扩展名变成了.txtExcel不会再走“双击打开CSV”那套自动转换逻辑而是强制走文本导入向导。你就能借机在向导里把身份证列手动指定成文本。改扩展名不会动文件内容成本极低很适合临时处理别人发来的现成CSV。要注意的是不要改完扩展名就双击那个.txt文件那样Excel依然会调用默认打开逻辑。正确姿势是打开Excel → 数据选项卡 → 自文本然后再选择这个.txt文件。这个方法在老版本Excel里格外好用因为老版本在“文件→打开”里选择CSV文件时部分版本会直接带出文本导入向导新版本反而简化掉了这个步骤直接默认打开。这就是为什么很多老教程里说的“打开CSV时会自动弹向导”在新版里看不到不是环境问题是版本改了逻辑。3. 源头解决生成CSV时就给身份证字段“留后手”如果你只是处理别人给的CSV导入向导和分列就够用了。但如果你是写脚本、写SQL、做系统导出的人更推荐在生成CSV的阶段就动手脚让文件天生就不会被Excel误伤。这章讲两个实战中最常用的招。3.1 万能前缀法在身份证号前面加一个制表符这是我个人最推荐的一招没有之一。做法很简单导出CSV时在身份证号码前面拼一个制表符也就是\t。为什么这招好使因为Excel打开CSV做类型推断时遇到以制表符开头的单元格会直接判定为“这不是纯数字”于是按文本处理。更妙的是制表符在Excel里不显示导入后你会看到干干净净的身份证号没有多余的前缀字符单元格左上角还会出现绿色小三角提示“以文本形式存储的数字”。这个绿三角不是错误是Excel在告诉你这格是文本不会参与计算。具体怎么实现看你的导出工具SQL导出时直接拼接SELECT CONCAT(\t, id_card) AS id_card FROM user;Python pandas导出时直接对列做变换df[id_card] \t df[id_card].astype(str) df.to_csv(output.csv, indexFalse)如果是Shell脚本可以用awk在指定列前面加制表符awk -F, BEGIN{OFS,} {print $1, \t$2, $3} input.csv output.csv这招最大的价值在于它不光对导入向导有效对“双击打开”同样有效。哪怕对方拿到CSV直接双击身份证照样不会变成科学计数法。也就是说你可以在源头就保证就算交付给一个完全不懂Excel的人他也不会把数据看坏。缺点也存在CSV里多了不可见字符如果这个文件后续还要被其他程序做二次解析比如导入数据库、喂给ETL程序那边可能需要对\t做strip处理。所以这个办法更适合“人看”的场景。如果数据链路是“程序解析”为主建议还是生成规范CSV然后在Excel侧用导入向导。3.2 公式前缀法用等号和双引号强制文本另一个老式做法是生成123456789012345678这样的内容。Excel打开时会把它当成公式等号表示公式开始双引号包裹的是文本公式计算结果就是身份证号码本身。这样既能强制变成文本又不会触发科学计数法。用SQL拼的话是这样SELECT CONCAT(, id_card, ) AS id_card FROM user;但它有明显副作用。第一CSV文件本身不标准了其他程序读取时可能把等号和引号一起读进去第二如果这个CSV后续用于导入数据库入库字段里可能残留前缀第三Excel公式本身有计算属性万一用户误操作触发重算也可能出现意外。所以我只在一种情况下用它源数据非常简单就是给一个人手动看没有二次处理环节。但凡有任何后续自动化处理我都优先用制表符方案绝不推荐公式前缀。3.3 适合开发者的另一条路从数据库导出时直接选对格式很多开发同学用Navicat、DBeaver、DataGrip等工具导出数据。这些工具导出CSV时如果源表字段类型是varchar或char导出的CSV本身是文本但如果源字段是bigint或decimal工具可能会导出成纯数字这在Excel里照样出问题。所以导出前先确认字段类型。身份证、手机号、银行卡号、学号这类“看着像数字其实是编码”的字段在数据库里就建议用varchar存不要用bigint。导出CSV时也要检查工具里的“导出格式”或“类型映射”选项必要的时候强制把这列转成字符串。如果你有权限改导出SQL最省事的方式就是直接拼接制表符或者用CAST把字段转成字符类型。例如SELECT CAST(id_card AS CHAR) AS id_card FROM user;这样导出的CSV天然是文本Excel怎么打开都没问题。4. 不同版本、不同系统下的处理细节同样一份CSV在Windows版Excel、Mac版Excel、WPS表格里的表现会有细微差别。下面把实操里经常遇到的几个分支情况理一遍。4.1 Mac版Excel的导入路径Mac版Excel从2016之后也有“数据”选项卡。操作路径是数据 → 获取数据Get Data→ 自文件 → 从文本/CSV。选择文件后会进入Power Query预览窗口操作逻辑和Windows版完全一致把身份证列的数据类型改成“文本”再加载。需要注意Mac版Excel对CSV编码的宽容度比Windows版略低。如果CSV是从Windows系统导出的GBK/ANSI编码Mac版Excel直接打开很容易乱码。解决办法要么在Mac上转成UTF-8编码再导入要么直接用导入向导并在向导里指明文件编码是GBK或UTF-8。4.2 WPS表格的处理方式WPS表格用户量不小它的默认行为其实比Excel更“主动”一些。双击打开CSV时WPS会自动弹一个文本导入向导这个弹窗里其实就可以处理数据类型在第三步选中身份证列把列格式改成“文本”然后点完成。如果你已经让WPS自动打开了CSV发现身份证列变成科学计数法操作方式也类似选中列 → 数据 → 分列按向导把该列改为文本。WPS的分列向导跟Excel老版本几乎一模一样用过Excel的人不会陌生。还有一个偏方在WPS的“选项→编辑”里取消勾选“自动将数字转换为科学计数法”相关选项。但我要泼盆冷水这个设置对手动输入更明显对CSV导入的场景帮助有限别指望靠它一劳永逸。最靠谱的还是导入向导或源头加前缀。4.3 把编码问题和长数字问题一起解决很多人在处理CSV时会同时遇到两个坑一个是身份证科学计数法一个是中文乱码。原因大多出在编码上。Excel处理GBK/ANSI编码的CSV一直没问题但很多现代系统生成的是UTF-8编码尤其是Linux服务器导出的CSV中文在Windows下直接打开就是一堆乱码。应对技巧有三个第一个用文本编辑器记事本、VS Code打开CSV另存为带BOM的UTF-8编码。“带BOM”是关键字Excel对带BOM的UTF-8识别特别友好。第二个用导入向导并在编码选择处手动选“65001:UTF-8”。老式文本导入向导里通常有文件来源选择可以选编码格式。第三个如果你用的是制表符前缀法还要注意编码统一别在GBK文件里混进UTF-8的制表符字节。我个人的优先级建议是如果是Linux或Mac上导出的CSV先在VS Code里把编码转成UTF-8 with BOM再交付给Excel用户。这一下能解决乱码和类型识别一大半问题。5. 常见问题与避坑速查写到这里你已经能解决大部分场景了。最后把我在实际工作中经常被问到的几个问题做成速查表按场景直接查方案。5.1 常见问题速查表场景处理方案双击CSV打开身份证列变成1.23E17立即不要保存用导入向导重新处理原始文件如果原始文件已被覆盖回源重新导出导入向导里找不到“文本”选项确认Excel版本新版在Power Query预览窗口里点列标题左侧类型图标老版在向导第三步勾选“文本”CSV打开后中文乱码用文本编辑器把文件另存为UTF-8 with BOM再重新导入单元格出现绿色小三角这是“文本型数字”的正常标识可以忽略不想看到就选中列点感叹号→忽略错误身份证后三位已经变成000无法恢复只能回源数据重新导出或从原始数据库重新查询需要批量合并几十个CSV用Power Query从文件夹获取数据在转换步骤中设置身份证列为文本5.2 从0到1的完整处理清单再给一个可以直接照着做的操作顺序第一步收到CSV后先用文本编辑器记事本、VS Code看一眼原始内容确认编码和分隔符。不要一上来就用Excel打开。第二步用Excel的数据导入向导加载CSV在预览界面把身份证、手机号、银行卡号这类字段全改成“文本”。第三步加载后随机抽几条数据对照源系统核验后三位确认没有截断。第四步如果还要交付给别人建议在文件开头附带一句说明告诉对方用导入向导打开或者干脆把文件改造成制表符前缀CSV再交付。对经常处理数据的人来说这套流程应该变成肌肉记忆不应该变成默认操作省下的时间绝对可观。5.3 其他长数字字段同样适用最后说个延伸点。这个坑不只属于身份证号。银行卡号、手机号、学号、工号、订单号、图书ISBN它们本质和身份证一样都是“编码型数据”不是真正参与计算的数字。所以在Excel里它们的敌人都是同一个自动类型识别。上面讲的导入向导、分列、制表符前缀、数据库字段类型等方案对它们照单全收原理完全一样。我自己后来养成的习惯就是凡是长数字一律当文本存凡是CSV一律导入向导打开凡是自己生成的文件优先在源头加制表符。做到这三条基本能避开这世上大多数“数据打开就变坏”的坑。最后再分享一个经验总结很多所谓“Excel显示身份证变成科学计数法”的问题最后查下来都不是Excel不行而是打开方式不对。改掉双击打开CSV这个习惯你就能从源头上躲过一大半麻烦。如果你是在团队里负责数据交付的人记得把导入向导的操作路径转告给同事一次说明白后面能省出无数个“数据坏了重跑”的周末。
返回列表