CSV是逗号还是分号?


80

CSV文件一般如何构建?用逗号还是分号?关于使用哪一个的任何建议?


5
请参见逗号分隔的值(Wikipedia)。
Jesper

4
CSV-

@ChadNC在选择我的代码将使用的定界符时,我也想到了这一点。最简单的解决方案是使用;,它可以在Ubuntu和Windows中自动识别,而无需我指定任何特定设置。
gsamaras

Answers:


76

在Windows中,它取决于“区域和语言选项”自定义屏幕,您可以在其中找到列表分隔符。Windows应用程序期望将其作为CSV分隔符。

当然,这仅在Windows应用程序中有效,例如,如果文件未使用上述分隔符,则Excel不会自动将数据拆分为列。使用Windows区域设置的所有应用程序将具有此行为。

如果您要为Windows编写程序,而该程序需要在其他应用程序中导入CSV,并且知道为目标计算机设置的列表分隔符为,,那么请继续使用它,否则,我宁愿这样做,;因为它会减少小数点和数字分组的问题并且不会以太多文字显示。


34
此更改还将影响在Excel中打开CSV文件。如果要与Windows CSV文件更兼容,请放在CSV文件的sep=;顶部。
papo 2015年

11
>“我更喜欢;因为它对小数点的影响较小”。这是错误的解决方案。如果分隔符是逗号,并且单元格的值也包含逗号,则必须将值括在双引号中。例如:111,222,“ 33,5”,444,“ 55,98”,666
Elmue '16

1
Mac Numbers应用程序也是如此。我拔头发是因为我无法制作Photoshop可以识别的csv。我将区域选项改回了美式英语,一切都再次正常
Tibidabo

18
该地区性事情是有史以来最愚蠢的事情。跨区域的csv格式如何不同,这意味着我的同事无法为其他区域内装有pc的人打开或保存csv。.oucch
Miguel

如果您是在Windows中CC++在Windows下进行编程,则可以使用以下API检索系统范围或用户定界符:GetLocaleInfo(lcid, LOCALE_SLIST, buff, _countof(buff));
ahmd0

51

我要说的是逗号,因为它已被广泛认可和理解。请务必引用您的值,但不要使用引号。

ID,NAME,AGE
"23434","Norris, Chuck","24"
"34343","Bond, James ""master""","57"

5
+1以一个非常简短的示例涵盖了很多csv场景
Niels Brinch 2012年

1
单独使用逗号分隔是好的,但是当您获得包含逗号的字段时,就会遇到问题。这是我在手册上
Ibu,

4
错误!在我的机器上,如果我使用逗号作为分隔符编写一个CSV文件并在Excel中打开它,则整行只占据一列!必须是Windows的某些区域设置!
sergiol

2
@sergiol我不确定这如何使他们所说的无效。
AMC

50

CSV是RFC 4180(在2005年)中概述的一种标准格式,因此不乏标准。 https://www.ietf.org/rfc/rfc4180.txt

甚至在此之前,CSV中的C一直代表逗号,而不是分号:(

遗憾的是,Microsoft一直无视它,并且仍然坚持数十年前将其转变为怪胎的方式(是的,我承认,那是在创建RFC之前)。

  • 每行一条记录,除非带引号的文本中出现换行符(请参见下文)。
  • COMMA作为列分隔符。绝对不要使用分号。
  • PERIOD为数字的小数点。从来没有逗号。
  • 包含用双引号引起来的逗号,句号和/或换行符的文本。
  • 当文本用双引号引起来时,文本中的此类引号才会通过加倍转义。这些示例代表相同的三个字段:

    1,“此文本包含”“引号”“”,3

    1,此文本包含“引号”,3

该标准不包括日期和时间值,我个人尝试遵循ISO 8601格式以避免日/月/年-月/日/年的混乱。


16
如果首先选择分号,就不会出现怪异的情况。与分号不同,逗号不仅用于小数或千位分隔符,而且还经常用于文本中。分号本来会是一个更好的选择,因为它很少见……
AFract

14
当我说怪物时,我的意思是微软使它依赖语言。Excel将打开CSV文件并将其视为电子表格,并且可以将电子表格保存为CSV格式,但是如果法国或比利时的某人试图打开它,则Excel在美国(例如)保存的CSV文件将无法工作,反之亦然。只要有适用于所有人的标准,无论哪种标准对我来说都是可以的。
Luc VdV

4
“ CSV是一种标准格式,在RFC 4180(2005年)中有所概述,因此不乏标准。” 不幸的是,RFC 4180是对注释的要求,而不是标准。它在顶部说:“没有指定任何类型的Internet标准。” 后来,它说RFC 4180 “记录了大多数实现似乎遵循的格式”。看来这是由一家小型私人公司创建的,与任何标准的主体无关。这是一个很好的起点,但是不幸的是,那里有很多不遵循此“标准”的CSV文件。
Jim Rea

9
所有互联网标准都称为RFC。
卢克VdV

2
但是,当它们是标准的时,它们并没有声明它们并非旨在成为规范。相反,它们中包含许多规范性部分,而RFC 4180则不是如此。
Frédéric19年

42

也是相关的,但特别是对于excel来说,看看这个答案另一个建议,在CSV的开头插入一行

"sep=,"

通知excel期望使用哪个分隔符


3
它可以与Excel一起使用,但是Microsoft Power BI无法识别它。
Tomas Kubes

8

1.>将文件格式更改为.CSV(以分号分隔)

为了获得理想的结果,我们需要临时更改delimiterExcel选项”中的设置:

Move to File -> Options -> Advanced -> Editing Section

取消选中“使用系统分隔符”设置,并在“小数分隔符”字段中输入逗号。

现在以文件.CSV格式保存文件,它将以分号分隔的格式保存。


6

最初它是一个逗号,但是由于逗号通常用作小数点,所以它不是很好的分隔符,因此,其他分号(例如分号)主要取决于国家/地区

http://en.wikipedia.org/wiki/Comma-separated_values#Lack_of_a_standard


维基百科文章的该部分消失了。您可能需要重新链接到 en.wikipedia.org/wiki/Comma-separated_values#Basic_rules,这在语言环境中有一段内容:>“相邻字段必须用单个逗号分隔。但是,” CSV“格式在特别是在使用逗号作为小数点分隔符的语言环境中,将使用分号,TAB或其他字符代替。”
Jules Kerssemakers

4

CSV是逗号分隔的文件。通常,分隔符是逗号,但是我已经看到许多其他字符用作分隔符。它们只是不经常使用。

至于为您提供使用建议,我们需要了解您的应用程序。文件是特定于您的应用程序/程序的,还是需要与其他程序一起使用的文件?


6
我认为在欧洲; 是普遍的。主要是因为我们有逗号,例如60,00€。
oers

5
@oers只要您拥有"quote"自己的价值观就没关系。
adarshr 2012年

好吧,我主要看到网络种子文件中使用了其他定界符,但是欧洲人也可以使用!
Youssef G. 2012年

4

要将逗号更改为分号作为CSV的默认Excel分隔符-转到区域->其他设置->数字标签->列表分隔符,然后输入;而不是默认值,


1
如果您将区域设置设置,为小数点分隔符,并且导出的文件,在Excel中打开时其列之间用分隔符隔开,则文本将仅出现在一列中。在Excel 2013中,选择第一列,转到数据- >文本到列- >选择Delimited,点击Next则只能选择CommaDelimiters,你会立即看到变化Data preview,最后单击Finish
sergiol

2

只是对分号有一些说法。在许多国家/地区,逗号是小数点而不是句点的用途。大多数情况下,欧盟殖民地占世界的一半,另一半则遵循英国标准(英国到底怎么这么大O_O),因此使用逗号对包含数字的数据库进行使用会造成很多麻烦,因为Excel拒绝将其识别为定界符。

就像我的国家越南一样,明智的做法是遵循法国的标准,我们的合作伙伴香港使用英国的标准,因此逗号使CSV无法使用,而我们使用\ t或; 代替供国际使用,但仍不是CSV文档的“标准”。


-3

最好的方法是将其保存在带有csv扩展名的文本文件中:

Sub ExportToCSV()
Dim i, j As Integer
Dim Name  As String

Dim pathfile As String

Dim fs As Object
    Dim stream As Object

    Set fs = CreateObject("Scripting.FileSystemObject")
On Error GoTo fileexists

i = 15
Name = Format(Now(), "ddmmyyHHmmss")
pathfile = "D:\1\" & Name & ".csv"

Set stream = fs.CreateTextFile(pathfile, False, True)

文件已存在:

If Err.Number = 58 Then
    MsgBox "File already Exists"
    'Your code here
    Return
End If
On Error GoTo 0

j = 1
Do Until IsEmpty(ThisWorkbook.ActiveSheet.Cells(i, 1).Value)

    stream.WriteLine (ThisWorkbook.Worksheets(1).Cells(i, 1).Value & ";" & Replace(ThisWorkbook.Worksheets(1).Cells(i, 6).Value, ".", ","))

    j = j + 1
    i = i + 1
Loop


stream.Close

End Sub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.