首页 > 解决方案 > 从 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 将其呈现为一个包含问号(不是菱形)的白色方框如excel所示

标签: phpcsvutf-8

解决方案


推荐阅读