php - 从 csv 中删除 unicode 符号,以便 Excel 可以在双击时导入
问题描述
我有一个 php (7.4) 函数,它生成一个大的(200k 行,10mb)csv 文件,内部用户可以下载和操作。
如果用户使用 python 或其他脚本解析文件,那么他们会看到所有数据。
如果用户打开 Excel,选择从 csv 导入,然后指定“65001:Unicode (UTF-8)”,那么他们会看到所有数据。
不幸的是,用户在下载管理器或文件资源管理器中单击文件,Excel 会尝试将文件解析为“1252:西欧 (Windows)”——在这种情况下,他们获得了大约 99% 的数据,其中包含一些损坏的行。
我想从源头删除问题数据并继续生成 csv,以免破坏下游流程。
这个python脚本标识了问题记录:
#! /usr/bin/env python3
import re
with open('file.csv') as f:
c = 0
d = 0
ct = {}
for l in f:
x = re.sub('[ -~]', '', l.rstrip())
if x != "":
d += 1
print("c:{} '{}' '{}'".format(c,x,l.rstrip()))
for y in x:
print(ord(y), hex(ord(y)), y.encode('utf-8'))
if ord(y) in ct:
ct[ord(y)] = ct[ord(y)] + 1
else:
ct[ord(y)] = 1
c += 1
print("Found {} problem lines out of {} total".format(d, c))
print(ct)
例如:
c:19286 '⿬⿬' '..."Come back an⿬~⿬ back"...'
226 0xe2 b'\xc3\xa2'
191 0xbf b'\xc2\xbf'
172 0xac b'\xc2\xac'
226 0xe2 b'\xc3\xa2'
191 0xbf b'\xc2\xbf'
172 0xac b'\xc2\xac'
如何⿬
在 php 中匹配和替换/删除?
我正在尝试以下,但它没有做任何事情:
$new = str_replace(
array(
"\u{00e2}",
"\u{00c3}\u{00a2}",
"\u{00e2}\u{00bf}\u{00ac}",
"\u{00c3}\u{00a2}\u{00c2}\u{00bf}\u{00c2}\u{00ac}",
),
array(
"#e2#",
"#c3a2#",
"#e2/bf/ac#",
"#c3a2/c2bf/c2ac#",
),
$text
);
编辑:将 226 代码点更正为 e2。这并没有解决问题。
⿬
是来自 python 的表示,excel 将其呈现为一个包含问号(不是菱形)的白色方框
解决方案
推荐阅读
- powershell - PowerShell 中的 bool[] 中是否可以包含 [Nullable[bool]]
- php - 获取列名中的特定自定义参数值
- sql - phpmyadmin程序查询
- python - 在 Python 中严格搜索和替换文本
- javascript - 未使用 document.getElementById('someId').appendChild() 添加的函数
- android - 我可以让 apk 在移动和 android-TV 中使用吗?
- python - 如何查看python中内置函数的源代码?例如:eval()
- html - css翻转动画在Mozilla中不起作用
- asterisk - 使用星号 ari 时,我是否打算开发自己的软电话?
- ios - 从 swift 派生的 obj-c 类的类别