当前位置: 首页 > 知识库问答 >
问题:

如何解决将数据导出到CSV平面文件时嵌入的文本限定符问题?

周弘毅
2023-03-14

RFC4180为逗号分隔值(CSV)文件定义通用格式和MIME类型。以下是RFC4180的一个要求。这是RFC链接中的点#7

If double-quotes are used to enclose fields, then a double-quote
appearing inside a field must be escaped by preceding it with
another double quote.  For example:

"aaa","b""bb","ccc"

SQL Server 2000中的DTS导出/导入向导似乎符合上述标准,尽管RFC4180本身似乎是在2005年10月才发布的。我使用的是以下所述的SQL Server2000版本。

Microsoft SQL Server  2000 - 8.00.2039 (Intel X86) 
May  3 2005 23:18:38 
Copyright (c) 1988-2003 Microsoft Corporation
Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)

SQL Server 2012中的SQL Server导入和导出向导不会根据RFC 4180中定义的标准将数据从表导出到CSV文件。我使用的是以下所述的SQL Server2012版本。

Microsoft SQL Server 2012 - 11.0.2316.0 (X64) 
Apr  6 2012 03:20:55 
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
CREATE TABLE dbo.ItemInformation(
    ItemId nvarchar(20) NOT NULL,
    ItemDesc nvarchar(100) NOT NULL
) 
GO

INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100338754', 'Crown Bolt 3/8"-16 x 1" Stainless-Steel Hex Bolt');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('202255836', 'Simpson Strong-Tie 5/8" SSTB Anchot Bolt');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100171631', 'Grip-Rite #11 x 1-1/2" Electro-Galvanized Steel Roofing Nails');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('202210289', 'Crown Bolt 1/2" x 3" "Zinc-Plated" Universal Clevis Pin');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('100136988', 'Tapcon 3/16" x 1-3/4" Climaseal Steel "Flat-Head" Phillips Concrete Anchors (75-Pack)');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES ('203722101', 'KwikTap 3/16" x 2-1/4" "Flat-Head" Concrete Screws (100-Pack)');
GO

SQL Server 2012中的SQL Server导入和导出向导上,我使用以下设置将数据导出到CSV文件。我以SQLServer2012_ItemInformation.csv的名称保存了该文件。

下面是使用Beyond Compare对这两个文件进行的比较。左侧包含由SQL Server 2000生成的文件,右侧包含由SQL Server 2012生成的文件。您可以注意到,SQL Server2000的左侧文件包含额外的双引号,以补偿数据列中的嵌入引号。这符合RFC 4180中指定的标准,但SQL Server 2012生成的文件中显然缺少该标准

我在网上搜索了这个bug,找到了以下链接。以下是Microsoft Connect上的错误报告。所有这些问题似乎都与导入文件有关,但与导出数据无关。所有这些bug都已作为修复关闭。

    null
    null

MSDN博客上的另一篇文章在Embedded Qualifiers一节下陈述了同样的情况。

  • 平面文件源在Denali中的更改

我知道解决这个问题的方法是编写一个查询,将我的列数据中的所有双引号()替换为两个双引号(),这样导出的文件最终将包含正确的嵌入限定符数据。这将避免直接从表中提取数据。

我已经在Microsoft Connect网站上提交了一份bug报告,以获得他们的反馈。下面是bug报告的链接。如果您同意这是一个错误,请访问下面的链接在Microsoft Connect网站上投票。

导出到CSV期间嵌入的文本限定符不符合RFC 4180

共有1个答案

宁弘亮
2023-03-14

我不会给出这个答案,除非你这么努力地记录下来,一个月后没有答案。所以,开始了。您唯一的选择似乎是更改数据或更改工具。

很可能,我显然做错了什么,错过了显而易见的事情。谁能给我解释一下我在这里做错了什么吗?

当工具坏了而供应商不关心时,继续尝试是错误的。是时候换了。您投入了大量精力来研究它到底是如何被破坏的,并证明它不仅违反了RFC,而且违反了工具自己的早期版本。你还需要多少证据?

HTH.

 类似资料:
  • 我有一个平面文件连接,它在SSIS包中加载文本文件。Visual Studio有时坚持在连接管理器上添加文本限定符,即使我删除了它。当添加此文本限定符时,将跳过文件中的最后一条记录,因此会导致问题。我需要一种方法来确保文件总是工作,有或没有这个限定符。既然我是以编程方式创建这些文件,那么它需要如何结束才能使限定符不影响它呢?我尝试用\r\n结束文件,但似乎没有解决问题。

  • 问题内容: 我需要将一些数据从mysql导出到csv文件。但是其中一列有换行符,我需要将数据导出到保存换行符的csv文件中。 目前,我正在使用以下sql查询: 但是该sql查询不会将换行符保存在csv文件中。我不是MySQL的专家,如果有人可以帮助我,我将不胜感激 问题答案: 您似乎正在遇到以下错误:https : //bugs.mysql.com/bug.php?id=40320自2008年以来

  • 我在网上读到,您可以使用几种不同的方法将数据帧的内容保存到数据湖中的CSV文件中。我的dataframe很好,但我似乎不能将它保存到CSV文件中。我很乐意把这个CSV放在湖里,或者放在我的桌面上。任何一个都没问题。 尝试1: 尝试2: 两种选择对我都不起作用。对于这两种情况,我将得到一条错误消息,内容为

  • 问题内容: 我有这个项目: 导入文件 连接到SQL Server数据库 将所有数据转移到数据库中 文本文件按选项卡划分为四个字段,例如数据库。 我已经完成了使用富文本框并将所有数据保存在字符串中的第一步。我的想法是将字符串拆分为每行并将其保存在数组中,然后:如何拆分每一行,以便可以正确保存字段?如何将SQL Server上的数据库连接到C#上的项目? 问题答案: 让我们一次解决这一步骤… 获取数据

  • 本文向大家介绍如何解决phpmyadmin导入数据库文件最大限制2048KB,包括了如何解决phpmyadmin导入数据库文件最大限制2048KB的使用技巧和注意事项,需要的朋友参考一下 解决办法如下: 1、打开php.ini。找到 upload_max_filesize 、 memory_limit 、 post_max_size 这三个参数! (在默认的情况下,php只允许最大的上传数据为2M

  • 如何将CSV文件导入MySQL表?我想把第一行数据用作列名。 我读到如何将CSV文件导入MySQL表?,但是唯一的答案是使用GUI而不是shell?