【问题标题】:Weird characters added to first column name after reading a toad-exported csv file读取 toad 导出的 csv 文件后添加到第一列名称的奇怪字符
【发布时间】:2014-05-23 09:01:49
【问题描述】:

每当我在 R (read.csv("file_name.csv")) 中读取使用 toad 导出的 csv 文件时,第一列名称前面都有以下字符“ï..”。此外,在 excel 或 notepad++ 中打开 csv 文件会正确显示(没有前面的字符)。这很麻烦,因为我的解决方法是在每次阅读后重命名该列。 感谢您对此问题的任何修复!

编辑:
导出是在 Toad 中通过右键单击查询的结果集并选择
“快速导出 -> 文件 -> CSV 文件”

创建的

每条评论的更多详细信息:

head(readLines('test_file.csv'),n=3)`<br>
[1] "ID,LOCATION" "12021,1204" "12281,1204"

【问题讨论】:

  • 能把head(readLines('file_name.csv'),n=3)的结果加进去吗?
  • r2evans,刚刚运行了你的代码并上传了它,我第一次看到反问号。感谢您对此进行调查。
  • 这告诉我这不是 R 问题。有一些方法可以解决这个问题,但 R 在这里表现正确。

标签: r csv toad


【解决方案1】:

试试这个:

d <- read.csv("test_file.csv", fileEncoding="UTF-8-BOM")

这适用于 R 3.0.0+ 并删除文件中存在的 BOM(常见于从 Microsoft 应用程序生成的文件:Excel、SQL 服务器)

【讨论】:

  • 这对我也有用!原始 csv 文件是在 Excel (Mac) 中创建的,我试图在 R (Windows) 中打开它。
  • 我意识到这是一个旧线程,但我只想提一下这对我也有用。
【解决方案2】:

我知道这是一个非常古老的问题,但我找到的最简单的解决方案是使用 NotePad++。在 NotePad++ 中打开 CSV 文件,单击“编码”并选择“以 UTF-8 编码”并保存文件。它删除了 BOM,原始代码应该可以工作。

【讨论】:

    【解决方案3】:
    我最近在剪贴板和 Microsoft Excel 中遇到了这个问题

    随着用于数据科学的多语言内容不断增加,不再采用 utf-8 的安全方法(在我的例子中,excel 采用 UTF-16,因为我的大部分数据都包含繁体中文(普通话) ?)。

    根据Microsoft Docs,Windows 中使用了以下 BOM:

    |----------------------|-------------|-----------------------|
    | Encoding             | Bom         | Python encoding kwarg |
    |----------------------|-------------|-----------------------|
    | UTF-8                | EF BB BF    | 'utf-8'               |
    | UTF-16 big-endian    | FE FF       | 'utf-16-be'           |
    | UTF-16 little-endian | FF FE       | 'utf-16-le'           |
    | UTF-32 big-endian    | 00 00 FE FF | 'utf-32-be'           |
    | UTF-32 little-endian | FF FE 00 00 | 'utf-32-le'           |
    |----------------------|-------------|-----------------------|
    

    我想出了以下方法,似乎可以很好地使用文件开头的字节顺序标记检测编码:

    def guess_encoding_from_bom(filename, default='utf-8'):
        msboms = dict((bom['sig'], bom) for bom in (
            {'name': 'UTF-8', 'sig': b'\xEF\xBB\xBF', 'encoding': 'utf-8'},
            {'name': 'UTF-16 big-endian', 'sig': b'\xFE\xFF', 'encoding':
                'utf-16-be'},
            {'name': 'UTF-16 little-endian', 'sig': b'\xFF\xFE', 'encoding':
                'utf-16-le'},
            {'name': 'UTF-32 big-endian', 'sig': b'\x00\x00\xFE\xFF', 'encoding':
                'utf-32-be'},
            {'name': 'UTF-32 little-endian', 'sig': b'\xFF\xFE\x00\x00',
                'encoding': 'utf-32-le'}))
    
        with open(filename, 'rb') as f:
            sig = f.read(4)
            for sl in range(3, 0, -1):
                if sig[0:sl] in msboms:
                    return msboms[sig[0:sl]]['encoding']
            return default
    
    
    # Example using python csv module
    def excelcsvreader(path, delimiter=',',
                    doublequote=False, quotechar='"', dialect='excel',
                    escapechar='\\', fileEncoding='UTF-8'):
        filepath = os.path.expanduser(path)
        fileEncoding = guess_encoding_from_bom(filepath, default=fileEncoding)
        if os.path.exists(filepath):
            # ok let's open it and parse the data
            with open(filepath, 'r', encoding=fileEncoding) as csvfile:
                csvreader = csv.DictReader(csvfile, delimiter=delimiter,
                    doublequote=doublequote, quotechar=quotechar, dialect=dialect,
                    escapechar='\\')
                for (rnum, row) in enumerate(csvreader):
                    yield (rnum, row)
    

    我意识到这需要打开文件以读取两次(一次是二进制文件,一次是编码文本),但在这种特殊情况下,API 并没有真正让其他操作变得容易。

    无论如何,我认为这比简单地假设 utf-8 更可靠,而且显然自动编码检测不起作用......

    【讨论】:

      【解决方案4】:

      经过进一步研究,这与 BOM(字节顺序标记)添加的字符有关。显然不能使用快速导出,而是使用数据导出向导,因为它允许设置文件编码。通过将其设置为西欧(Windows)而不是 unicode utf-8,它对我有用。

      How do I remove  from the beginning of a file?

      【讨论】:

      • 升级到较新版本(Toad Data Point 3.4.0.2038)后此问题消失
      • 为我工作!我正在导入使用 Excel 2016 创建的 csv。
      【解决方案5】:

      这与BOM 有关。只是想添加到上面提出的解决方案中,您可以通过以下方式避免在文件开头添加 BOM:

      • 从记事本或 Notepad++ 创建 csv 文件,然后以“.csv”扩展名保存;
      • 还有一些 IDE,例如PyCharm,具有用于此标记删除的内置功能:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 2013-09-05
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        相关资源
        最近更新 更多