处理CSV文件中的逗号


472

我正在寻找有关如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且该值可能带有逗号(例如公司名称)。

我们正在研究的一些想法是:带引号的标识符(值“,”值“,”等)或使用|。而不是逗号。最大的问题是我们必须使其变得容易,否则客户将无法做到。


客户正在编写并上传它
Bob The Janitor

1
这是在csv文件中管理内部逗号的解决方案。请访问stackoverflow.com/questions/9889225/…–
哈桑·阿布拉

在iOS上,基本上是你必须使用 github.com/Flinesoft/CSVImporter
Fattie

3
请注意,此质量检查已过时。如今,csv就是RFC 4180,仅此而已
Fattie

我有完全相同的问题,试图在以逗号分隔的csv文件中总计一列。awk命令没问题。不幸的是,某些单元格可能包含逗号(例如在地址中),而其他单元格则不会。寻找与Linux兼容的解决方案,但不确定从哪里开始。
greenage

Answers:


223

正如其他人所说,您需要转义包含引号的值。这是C♯中的一个小型CSV阅读器,它支持带引号的值,包括嵌入的引号和回车。

顺便说一下,这是经过单元测试的代码。我现在发布它是因为这个问题似乎很多,而且当简单的CSV支持可以解决其他问题时,其他人可能不想要整个库。

您可以按以下方式使用它:

using System;
public class test
{
    public static void Main()
    {
        using ( CsvReader reader = new CsvReader( "data.csv" ) )
        {
            foreach( string[] values in reader.RowEnumerator )
            {
                Console.WriteLine( "Row {0} has {1} values.", reader.RowIndex, values.Length );
            }
        }
        Console.ReadLine();
    }
}

这是课程。请注意,您也可以使用该Csv.Escape功能写入有效的CSV。

using System.IO;
using System.Text.RegularExpressions;

public sealed class CsvReader : System.IDisposable
{
    public CsvReader( string fileName ) : this( new FileStream( fileName, FileMode.Open, FileAccess.Read ) )
    {
    }

    public CsvReader( Stream stream )
    {
        __reader = new StreamReader( stream );
    }

    public System.Collections.IEnumerable RowEnumerator
    {
        get {
            if ( null == __reader )
                throw new System.ApplicationException( "I can't start reading without CSV input." );

            __rowno = 0;
            string sLine;
            string sNextLine;

            while ( null != ( sLine = __reader.ReadLine() ) )
            {
                while ( rexRunOnLine.IsMatch( sLine ) && null != ( sNextLine = __reader.ReadLine() ) )
                    sLine += "\n" + sNextLine;

                __rowno++;
                string[] values = rexCsvSplitter.Split( sLine );

                for ( int i = 0; i < values.Length; i++ )
                    values[i] = Csv.Unescape( values[i] );

                yield return values;
            }

            __reader.Close();
        }
    }

    public long RowIndex { get { return __rowno; } }

    public void Dispose()
    {
        if ( null != __reader ) __reader.Dispose();
    }

    //============================================


    private long __rowno = 0;
    private TextReader __reader;
    private static Regex rexCsvSplitter = new Regex( @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))" );
    private static Regex rexRunOnLine = new Regex( @"^[^""]*(?:""[^""]*""[^""]*)*""[^""]*$" );
}

public static class Csv
{
    public static string Escape( string s )
    {
        if ( s.Contains( QUOTE ) )
            s = s.Replace( QUOTE, ESCAPED_QUOTE );

        if ( s.IndexOfAny( CHARACTERS_THAT_MUST_BE_QUOTED ) > -1 )
            s = QUOTE + s + QUOTE;

        return s;
    }

    public static string Unescape( string s )
    {
        if ( s.StartsWith( QUOTE ) && s.EndsWith( QUOTE ) )
        {
            s = s.Substring( 1, s.Length - 2 );

            if ( s.Contains( ESCAPED_QUOTE ) )
                s = s.Replace( ESCAPED_QUOTE, QUOTE );
        }

        return s;
    }


    private const string QUOTE = "\"";
    private const string ESCAPED_QUOTE = "\"\"";
    private static char[] CHARACTERS_THAT_MUST_BE_QUOTED = { ',', '"', '\n' };
}

2
您可能还需要翻译\ r \ n以符合Windows的要求,具体取决于您的应用程序。
Mandrake '02

3
@NadaNaeem,想详细说明吗?
harpo 2015年

它没有正确计算csv文件行中的项目,没有很好地处理字段中的逗号以及勇气回报和点击
Nada N. Hantouli 2015年

-1 OP没有指定创建文件的语言。如果有其他程序员来这里寻求除C#以外的任何语言的解决方案,他们将找不到可以在此答案中使用的解决方案。
Ben Leggiero 2015年

8
@ BenC.R.Leggiero,那么我想您也必须投票否决这个问题,因为按照您的标准无法回答。实际上,该代码相当于一个简单规范的正式实现,并且可以轻松地转换为任何常用语言。
harpo 2015年

395

对于2017年,csv已完全指定-RFC 4180。

这是一个非常常见的规范,并且被许多库(示例)完全涵盖。

只需使用任何易于使用的csv库 -即RFC 4180。


实际上,有一个CSV格式规范以及如何处理逗号:

包含换行符(CRLF),双引号和逗号的字段应用双引号引起来。

http://tools.ietf.org/html/rfc4180

因此,要具有foobar,baz,您可以这样做:

foo,"bar,baz"

需要考虑的另一个重要要求(同样来自规范):

如果使用双引号将字段括起来,则必须在字段内部出现双引号,方法是在其前面加上另一个双引号来对其进行转义。例如:

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

120
“包含换行符(CRLF),双引号和逗号的字段应用双引号引起来。”
Eli

42
“如果使用双引号将字段括起来,则必须在字段内部出现双引号,并在其前面加上另一个双引号来转义。”
C. Dragon 76

11
并不是真正的规格,但可能仍然很方便。它说:“不存在正式的规范,它允许对CSV文件进行各种各样的解释。本节记录了大多数实现似乎遵循的格式。”
贾斯汀·克拉克

5
另外,请不要忘记,尽管它的名字如此,但行中的CSV值不仅可以用逗号分隔-至少在Windows平台上也可以。它取决于当前的区域设置(命令行中的intl.cpl,“高级设置”),尤其是列表分隔符:System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator
lxa 2013年

4
除了链接以外,请在此答案中添加相关信息,以A)删除上述大部分评论(和我的评论),B)比回答者节省更多的人,然后转到另一页并找到相关内容。数据,C)防止链接腐烂。
user66001

76

CSV格式使用逗号分隔值,包含回车符,换行符,逗号或双引号的值被双引号引起来。包含双引号的值被引号,并且每个文字引号都被前一个引号引起来:例如,这三个值:

test
list, of, items
"go" he said

将被编码为:

test
"list, of, items"
"""go"" he said"

任何字段都可以加引号,但仅包含逗号,CR / NL或引号的字段必须加引号。

CSV格式没有真正的标准,但是几乎所有应用程序都遵循此处记录的约定。在其他地方提到的RFC不是CSV的标准,它是在MIME中使用CSV的RFC,并且包含一些非常规和不必要的限制,这些限制使其在MIME之外无法使用。

我见过很多CSV模块不适应的问题是,可以在一个字段中编码多行,这意味着您不能假设每一行都是单独的记录,您要么不需要在您的行中换行数据或准备处理此问题。


40

用双引号引起来。这通常是Excel所做的

阿拉·埃利

您将双引号转义为两个双引号。例如“ test1”,“ foo”,“ bar”,“ test2”


基本上是相同的概念为带引号的标识符
鲍勃看门人

1
您将双引号转义为两个双引号。例如“ test1”,“ foo”,“ bar”,“ test2”
Eli

当字符串后面紧跟一个逗号时,仅在字符串
两边加上

9

您可以在字段两边加上双引号。我不喜欢这种方法,因为它增加了另一个特殊字符(双引号)。只需定义一个转义字符(通常是反斜杠),并在需要转义某些内容的地方使用它:

数据,更多数据,更多数据\,甚至更多

您不必尝试匹配引号,并且可以解析的异常更少。这也简化了您的代码。


3
快速又肮脏,但是如果您实际包含“ \”的条目不起作用
Sarp Kaya14年

1
Sarp,这就是为什么双\\是转义的反斜杠的原因,因为它现在成为另一个特殊字符。
Grungondola

1
这有效,但不是CSV。这是DSV
TRiG

8

nuget提供了一个库,用于处理几乎任何格式良好的CSV(.net)-CsvHelper

映射到类的示例:

var csv = new CsvReader( textReader );
var records = csv.GetRecords<MyClass>();

读取各个字段的示例:

var csv = new CsvReader( textReader );
while( csv.Read() )
{
    var intField = csv.GetField<int>( 0 );
    var stringField = csv.GetField<string>( 1 );
    var boolField = csv.GetField<bool>( "HeaderName" );
}

让客户端驱动文件格式:
,是标准字段分隔符,"是用于转义包含定界符,引号或行尾的字段的标准值。

要将(例如)#用于字段和'转义:

var csv = new CsvReader( textReader );
csv.Configuration.Delimiter = "#";
csv.Configuration.Quote = ''';
// read the file however meets your needs

更多文件


3
如果您提供了一个示例,说明如何使用该CsvHelper库来解决OP的问题,那将是更好的选择。
乔治·斯托克2014年

为什么.Net中的几乎所有内容都必须成为“帮助者”……这个词几乎没有意义……就像“经理”一样。
bytedev

5

正如我在harpo答案中的评论中所提到的那样,他的解决方案很好,并且在大多数情况下都可以使用,但是在某些情况下,当逗号彼此直接相邻时,逗号就无法拆分。

这是因为正则表达式字符串意外地充当了Vertabim字符串。为了使此行为正确无误,需要手动对正则表达式字符串中的所有字符进行转义,而无需使用vertabim转义符。

就是 正则表达式应该使用手动转义符来实现:

",(?=(?:[^\"\"]*\"\"[^\"\"]*\"\")*(?![^\"\"]*\"\"))"

转化为 ",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"

使用vertabim字符串时,@",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"其行为如下所示,您可以查看是否调试了正则表达式:

",(?=(?:[^"]*"[^"]*")*(?![^"]*"))"

因此,总而言之,我推荐harpo的解决方案,但请注意这一小技巧!

我在CsvReader中包含了一些可选的故障保护功能,以在发生此错误时通知您(如果您具有预先知道的列数):

if (_expectedDataLength > 0 && values.Length != _expectedDataLength) 
throw new DataLengthException(string.Format("Expected {0} columns when splitting csv, got {1}", _expectedDataLength, values.Length));

这可以通过构造函数注入:

public CsvReader(string fileName, int expectedDataLength = 0) : this(new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
    _expectedDataLength = expectedDataLength;
}

您将如何处理标题行?我试图将csv映射到所有类型的C#对象,但是标题行将其中断,因为它的所有字符串都出现了
tCoe18年

[^""]一样[^"]吗?在字符类规范中重复字符是多余的,对吗?
Minh Tran,

4

添加对Microsoft.VisualBasic的引用(是的,它说是VisualBasic,但它也可以在C#中工作-请记住,最后都只是IL)。

使用Microsoft.VisualBasic.FileIO.TextFieldParser该类来解析CSV文件,这是示例代码:

 Dim parser As TextFieldParser = New TextFieldParser("C:\mar0112.csv")
 parser.TextFieldType = FieldType.Delimited
 parser.SetDelimiters(",")      

   While Not parser.EndOfData         
      'Processing row             
      Dim fields() As String = parser.ReadFields         
      For Each field As String In fields             
         'TODO: Process field                   

      Next      
      parser.Close()
   End While 

是的,在有点不幸的命名空间;-)中,这是一个非常有用的类。但是,要解决最初的问题,您还应该进行设置parser.HasFieldsEnclosedInQuotes = true;,并且输入文件将需要根据CSV规范用引号将包含逗号的字段括起来-excel已经做到了。
克里斯托弗·金


4

如果您使用的是* nix系统,只能访问CSV 特定字段,并且只能在 CSV 特定字段中使用sed一个或多个不需要的逗号,则可以使用以下单行格式将它们括起来"作为RFC4180部分2建议:

sed -r 's/([^,]*,[^,]*,[^,]*,)(.*)(,.*,.*)/\1"\2"\3/' inputfile

根据您希望在哪个字段中添加不必要的逗号,您必须更改/扩展正则表达式的捕获组(以及替换)。
上面的示例将第四个字段(六个字段中)括在引号中。

在此处输入图片说明

--in-place-option结合使用,可以将这些更改直接应用于文件。

为了“构建”正确的正则表达式,有一个简单的原则可以遵循:

  1. 对于CSV 字段中出现不必要的逗号之前的每个字段,请编写一个字段[^,]*,并将它们放在一起组成一个捕获组。
  2. 对于包含不想要的逗号的字段,请编写(.*)
  3. 对于带有多余逗号的字段之后的每个字段请编写一个字段,.* 并将它们全部放入一个捕获组中。

这是根据特定字段的不同可能正则表达式/替换的简短概述。如果未给出,则替换为\1"\2"\3

([^,]*)(,.*)                     #first field, regex
"\1"\2                           #first field, substitution

(.*,)([^,]*)                     #last field, regex
\1"\2"                           #last field, substitution


([^,]*,)(.*)(,.*,.*,.*)          #second field (out of five fields)
([^,]*,[^,]*,)(.*)(,.*)          #third field (out of four fields)
([^,]*,[^,]*,[^,]*,)(.*)(,.*,.*) #fourth field (out of six fields)

如果要删除不需要的逗号sed而不是用引号引起来,请参考此答案


3

如果您想重新发明轮子,可以使用以下方法:

public static IEnumerable<string> SplitCSV(string line)
{
    var s = new StringBuilder();
    bool escaped = false, inQuotes = false;
    foreach (char c in line)
    {
        if (c == ',' && !inQuotes)
        {
            yield return s.ToString();
            s.Clear();
        }
        else if (c == '\\' && !escaped)
        {
            escaped = true;
        }
        else if (c == '"' && !escaped)
        {
            inQuotes = !inQuotes;
        }
        else
        {
            escaped = false;
            s.Append(c);
        }
    }
    yield return s.ToString();
}

3

在欧洲,我们遇到的这个问题必须早于这个问题。在欧洲,我们使用逗号作为小数点。请参阅下面的数字:

| American      | Europe        |
| ------------- | ------------- |
| 0.5           | 0,5           |
| 3.14159265359 | 3,14159265359 |
| 17.54         | 17,54         |
| 175,186.15    | 175.186,15    |

因此,不可能对CSV文件使用逗号分隔符。因此,欧洲的CSV文件用分号;分隔。

诸如Microsoft Excel之类的程序可以用分号读取文件,并且可以从分隔符切换。您甚至可以使用制表符(\t)作为分隔符。请参阅超级用户的答案


2

如果您对关于如何一般地解析文件的更具教育意义的练习感兴趣(以CSV为例),则可以查看Julian Bucknall的这篇文章。我喜欢这篇文章,因为它可以将事情分解成更小的问题,这些问题要难得多。首先创建一个语法,一旦有了良好的语法,将语法转换为代码是一个相对容易且有条理的过程。

本文使用C#,并在底部具有一个链接来下载代码。



1

只需在NuGet上使用SoftCircuits.CsvParser。它将为您处理所有这些详细信息,并有效处理非常大的文件。而且,如果需要,它甚至可以通过将列映射到对象属性来导入/导出对象。此外,我的测试表明,它的平均速度比流行的CsvHelper快近4倍。


0

因为这是关于常规的,所以我们从经验法则开始:

  1. 不要使用CSV,而是将XML与库一起使用来读写XML文件。

  2. 如果必须使用CSV。正确执行此操作,并使用免费的库来解析和存储CSV文件。

为了证明1)的合理性,大多数CSV解析器都不支持编码,因此,如果您不处理US-ASCII,就会遇到麻烦。例如,excel 2002以本地编码存储CSV,而没有任何关于编码的注释。CSV标准未被广泛采用:(。另一方面,xml标准被广泛采用,并且可以很好地处理编码。

为了说明2),几乎所有语言都有大量的csv解析器,因此即使解决方案看起来很简单,也无需重新发明轮子。

仅举几例:

  • 用于python使用csv模块中的构建

  • 对于perl检查CPAN和Text :: CSV

  • 为PHP使用在fgetcsv / fputcsv函数中构建

  • 对于Java检查SuperCVS

如果您不打算在嵌入式设备上解析它,那么确实不需要手动实现。


12
XML并不总是答案。当您拥有大量密集的表格数据(即电子表格)时,CSV是适合该作业的正确格式。这些标记会带来很多开销,并且如果每一行都具有相同的格式,则无需明确说明每个值代表什么。当您具有复杂的层次结构数据或带有可选字段的记录时,XML非常有用。并非总是如此。
亚当·贾斯基维奇

从理论上讲,“标签”会带来一些开销,但是我无法想到任何实际应用中开始出现问题的地方。你有实际的例子吗?要处理数据,应该使用数据库而不是csv。如果我们谈论数据序列化(备份,数据交换),那么解析需要一周而不是5天会很重要吗?
Piotr Czapla

2
基本上,任何情况下您的数据都可以用表最好地表示。假设您有来自十几个不同传感器的数据,这些信号经常进行采样,然后记录当时的时间戳和每个传感器的值。每个记录都是相同的:时间戳记,传感器0,传感器1,...传感器11。XML非常适合表示复杂的不规则数据,但是它是一种重量级的格式,不能满足所有情况。吻
Adam Jaskiewicz 09年

10
有人看到一个问题,他们说“我知道,我将使用XML!” 现在他们有两个问题。
亚当·贾斯基维奇

我完全同意xml不能解决所有问题。特别是它不适合作为数据库的替代品或配置文件。但是这里的问题是关于XML的数据交换。
Piotr Czapla

0

您可以像这样读取csv文件。

这利用了分割并照顾了空间。

ArrayList List = new ArrayList();
static ServerSocket Server;
static Socket socket;
static ArrayList<Object> list = new ArrayList<Object>();


public static void ReadFromXcel() throws FileNotFoundException
{   
    File f = new File("Book.csv");
    Scanner in = new Scanner(f);
    int count  =0;
    String[] date;
    String[] name;
    String[] Temp = new String[10];
    String[] Temp2 = new String[10];
    String[] numbers;
    ArrayList<String[]> List = new ArrayList<String[]>();
    HashMap m = new HashMap();

         in.nextLine();
         date = in.nextLine().split(",");
         name = in.nextLine().split(",");
         numbers = in.nextLine().split(",");
         while(in.hasNext())
         {
             String[] one = in.nextLine().split(",");
             List.add(one);
         }
         int xount = 0;
         //Making sure the lines don't start with a blank
         for(int y = 0; y<= date.length-1; y++)
         {
             if(!date[y].equals(""))
             {   
                 Temp[xount] = date[y];
                 Temp2[xount] = name[y];
                 xount++;
             }
         }

         date = Temp;
         name =Temp2;
         int counter = 0;
         while(counter < List.size())
         {
             String[] list = List.get(counter);
             String sNo = list[0];
             String Surname = list[1];
             String Name = list[2];
             for(int x = 3; x < list.length; x++)
             {           
                 m.put(numbers[x], list[x]);
             }
            Object newOne = new newOne(sNo, Name, Surname, m, false);
             StudentList.add(s);
             System.out.println(s.sNo);
             counter++;
         }

0

首先,让我们问自己:“为什么我们觉得有必要对CSV文件使用不同的逗号处理?”

对我来说,答案是:“因为当我将数据导出到CSV文件时,字段中的逗号消失了,并且我的字段被分成了多个字段,其中逗号出现在原始数据中。” (之所以这样,是因为逗号是CSV字段分隔符。)

根据您的情况,半冒号也可以用作CSV字段分隔符。

根据我的要求,我可以使用看起来像逗号的字符,例如低9引号。

因此,这是您可以在Go中执行的操作:

// Replace special CSV characters with single low-9 quotation mark
func Scrub(a interface{}) string {
    s := fmt.Sprint(a)
    s = strings.Replace(s, ",", "‚", -1)
    s = strings.Replace(s, ";", "‚", -1)
    return s
}

替换功能中的第二个逗号字符是十进制8218。

请注意,如果您的客户可能只有纯ASCII文本阅读器,那么该decima 8218字符将看起来不像逗号。如果是这种情况,则建议您根据RFC 4128用双引号将逗号(或分号)括起来:https : //tools.ietf.org/html/rfc4180


0

我通常对可以包含任何逗号或任何特殊字符的字段进行URL编码。然后在任何可视媒体中使用/显示它时将其解码。

(逗号变为%2C)

每种语言都应具有URL编码和解码字符串的方法。

例如,在Java中

URLEncoder.encode(myString,"UTF-8"); //to encode
URLDecoder.decode(myEncodedstring, "UTF-8"); //to decode

我知道这是一个非常通用的解决方案,对于用户希望手动查看csv文件内容的情况,它可能不是理想的选择。


0

我通常在CSV文件解析例程中执行此操作。假设“ line”变量是CSV文件中的一行,并且所有列的值都用双引号引起来。执行以下两行后,您将在“值”集合中获得CSV列。

// The below two lines will split the columns as well as trim the DBOULE QUOTES around values but NOT within them
    string trimmedLine = line.Trim(new char[] { '\"' });
    List<string> values = trimmedLine.Split(new string[] { "\",\"" }, StringSplitOptions.None).ToList();

1
为什么我的代码从不以多种颜色显示在StackOverflow上?我缩进了四个空格。
user1451111 '02


0

我找到的最简单的解决方案是LibreOffice使用的一种解决方案:

  1. 将所有文字替换"
  2. 用双引号引起来

您还可以使用Excel使用的一种:

  1. 将所有文字替换"""
  2. 用双引号引起来

请注意,其他人建议仅执行上面的步骤2,但这不适用于a "后面紧跟a的行,,例如在CSV中,您希望使用字符串hello",world作为单列,因为CSV会显示为:

"hello",world"

解释为具有两列的行:helloworld"


1
按照标准规则,任何包含拆分字符或引号的字段都被引号引起来,并且其中的所有引号都被加倍,因此没有问题。您的hello",world字段仅需要保存为"hello"",world",就可以正确解析100%。
Nyerguds

0
    public static IEnumerable<string> LineSplitter(this string line, char 
         separator, char skip = '"')
    {
        var fieldStart = 0;
        for (var i = 0; i < line.Length; i++)
        {
            if (line[i] == separator)
            {
                yield return line.Substring(fieldStart, i - fieldStart);
                fieldStart = i + 1;
            }
            else if (i == line.Length - 1)
            {
                yield return line.Substring(fieldStart, i - fieldStart + 1);
                fieldStart = i + 1;
            }

            if (line[i] == '"')
                for (i++; i < line.Length && line[i] != skip; i++) { }
        }

        if (line[line.Length - 1] == separator)
        {
            yield return string.Empty;
        }
    }

0

我使用了Csvreader库,但通过使用它,我通过从列值中的comma(,)爆炸得到了数据。

因此,如果您想在大多数列值中插入包含逗号(,)的CSV文件数据,则可以使用以下函数。作者链接=> https://gist.github.com/jaywilliams/385876

function csv_to_array($filename='', $delimiter=',')
{
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    return $data;
}

0

我使用了papaParse库来解析CSV文件并具有键值对(键/标题/ CSV文件值的第一行)。

这是我使用的示例:

https://codesandbox.io/embed/llqmrp96pm

它里面有dummy.csv文件,可以进行CSV解析演示。

我已经在reactJS中使用了它,尽管可以很容易地在使用任何语言编写的应用程序中进行复制。


0

一个示例可能有助于显示逗号如何显示在.csv文件中。创建一个简单的文本文件,如下所示:

将此文本文件另存为带有后缀“ .csv”的文本文件,并从Windows 10使用Excel 2000将其打开。

“ aa,bb,cc,d; d”在电子表格演示文稿中,下一行应与上一行类似,但下一行显示显示的逗号而不是d之间的分号。aa,bb,cc,“ d,d”,即使在Excel中也可以使用

aa,bb,cc,“ d,d”,即使在Excel 2000中也可以使用aa,bb,cc,“ d,d”,即使在Excel 2000中也可以使用aa,bb,cc,“ d,d”,这可以使用即使在Excel 2000中

aa,bb,cc,“ d,d”,由于空格在第一个引号引起来,在Excel 2000中失败aa,bb,cc,“ d,d”,由于空格在第一个引号中引起了在Excel 2000中失败aa,bb,cc,“ d,d”,由于空格引号第一个引号在Excel 2000中失败

aa,bb,cc,“ d,d”,即使在Excel 2000中也可以使用,即使在第二个引号之前和之后都有空格。aa,bb,cc,“ d,d”,即使在Excel 2000中也可以使用,即使在第二个引号之前和之后都有空格。aa,bb,cc,“ d,d”,即使在Excel 2000中也可以使用,即使在第二个引号之前和之后都有空格。

规则:如果要在.csv文件的a单元格(字段)中显示逗号,请执行以下操作:“用双引号将字段开头和结尾,但请避免在第一引号之前使用空格”


-1

我认为解决此问题的最简单方法是让客户在excel中打开csv,然后按ctrl + r用所需的任何标识符替换所有逗号。这对客户来说非常容易,并且只需更改代码即可读取您选择的定界符。


谁说他们有Excel?实际上,谁说它甚至是一个正在上载的人?...
bytedev

-3

使用制表符(\ t)分隔字段。


4
-1很好,直到有人在其值中使用选项卡,然后您才可以回到提出问题的人那里。将一个定界符替换为另一个定界符并不能解决问题。
bytedev

废话。人们无法在数据输入中输入标签。在大多数形式中,这只是将数据输入点移动到下一个字段。
Pierre

6
“人们无法在其数据输入中输入标签”。...您是认真的吗?A)当然,一个人可以在输入字段中放置一个标签。B)谁说这是数据来源的GUI?C)谁说它甚至是输入数据的人?
bytedev
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.