广告
返回顶部
首页 > 资讯 > 精选 >C#如何实现读写CSV文件
  • 679
分享到

C#如何实现读写CSV文件

2023-07-02 09:07:28 679人浏览 泡泡鱼
摘要

这篇文章主要介绍“C#如何实现读写CSV文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#如何实现读写CSV文件”文章能帮助大家解决问题。CSV文件标准在介绍CSV文件的读写方法前,我们需要了解

这篇文章主要介绍“C#如何实现读写CSV文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#如何实现读写CSV文件”文章能帮助大家解决问题。

CSV文件标准

在介绍CSV文件的读写方法前,我们需要了解一下CSV文件的格式。

文件示例

一个简单的CSV文件:

Test1,Test2,Test3,Test4,Test5,Test6str1,str2,str3,str4,str5,str6str1,str2,str3,str4,str5,str6

一个不简单的CSV文件:

"Test1"",""","Test2"",""","Test3"",""","Test4"",""","Test5"",""","Test6"","""" 中文,D23 ","3DFD4234""""""1232""1S2","ASD1"",""23,,,,21323F32","",,asd" 中文,D23 ","3DFD4234""""""1232""1S2","ASD1"",""23,,,,21323F32","",,asd

你没看错,上面两个都是CSV文件,都只有3行CSV数据。第二个文件多看一眼都是精神污染,但项目中无法避免会出现这种文件。

RFC 4180

CSV文件没有官方的标准,但一般项目都会遵守 RFC 4180 标准。这是一个非官方的标准,内容如下:

Each record is located on a separate line, delimited by a line break (CRLF).

The last record in the file may or may not have an ending line break.

There maybe an optional header line appearing as the first line of the file with the same fORMat as normal record lines. This header will contain names corresponding to the fields in the file and should contain the same number of fields as the records in the rest of the file (the presence or absence of the header line should be indicated via the optional "header" parameter of this MIME type).

Within the header and each record, there may be one or more fields, separated by commas. Each line should contain the same number of fields throughout the file. Spaces are considered part of a field and should not be ignored. The last field in the record must not be followed by a comma.

Each field may or may not be enclosed in double quotes (however some programs, such as Microsoft excel, do not use double quotes at all). If fields are not enclosed with double quotes, then double quotes may not appear inside the fields.

Fields containing line breaks (CRLF), double quotes, and commas should be enclosed in double-quotes.

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.

翻译一下:

  • 每条记录位于单独的行上,由换行符 (CRLF) 分隔。

  • 文件中的最后一条记录可能有也可能没有结束换行符。

  • 可能有一个可选的标题行出现在文件的第一行,格式与普通记录行相同。此标题将包含与文件中的字段对应的名称,并且应包含与文件其余部分中的记录相同数量的字段(标题行的存在或不存在应通过此 MIME 类型的可选“标头”参数指示)。

  • 在标题和每条记录中,可能有一个或多个字段,以逗号分隔。在整个文件中,每行应包含相同数量的字段。空格被视为字段的一部分,不应忽略。记录中的最后一个字段后面不能有逗号。

  • 每个字段可以用双引号括起来,也可以不用双引号(但是某些程序,例如 Microsoft Excel,根本不使用双引号)。如果字段没有用双引号括起来,那么双引号可能不会出现在字段内。

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

  • 如果使用双引号将字段括起来,则出现在字段中的双引号必须在其前面加上另一个双引号。

简化标准

上面的标准可能比较拗口,我们对它进行一些简化。要注意一下,简化不是简单的删减规则,而是将类似的类似进行合并便于理解。
后面的代码也会使用简化标准,简化标准如下:

  • 每条记录位于单独的行上,由换行符 (CRLF) 分隔。

  • 注:此处的行不是普通文本意义上的行,是指符合CSV文件格式的一条记录(后面简称为CSV行),在文本上可能占据多行。

  • 文件中的最后一条记录需有结束换行符,文件的第一行为标题行(标题行包含字段对应的名称,标题数与记录的字段数相同)。

  • 注:原标准中可有可无的选项统一规定为必须有,方便后期的解析,而且没有标题行让别人怎么看数据。

  • 在标题和每条记录中,可能有一个或多个字段,以逗号分隔。在整个文件中,每行应包含相同数量的字段空格被视为字段的一部分,不应忽略。记录中的最后一个字段后面不能有逗号

  • 注:此标准未做简化,虽然也有其它标准使用空格、制表符等做分割的,但不使用逗号分割的文件还叫逗号分隔值文件吗。

  • 每个字段都用双引号括起来,出现在字段中的双引号必须在其前面加上另一个双引号

  • 注:原标准有必须使用双引号和可选双引号的情况,那全部使用双引号肯定不会出错。*

读写CSV文件

在正式读写CSV文件前,我们需要先定义一个用于测试的Test类。代码如下:

class Test{    public string Test1{get;set;}    public string Test2 { get; set; }    public string Test3 { get; set; }    public string Test4 { get; set; }    public string Test5 { get; set; }    public string Test6 { get; set; }    //Parse方法会在自定义读写CSV文件时用到    public static Test Parse (string[]fields )    {        try        {            Test ret = new Test();            ret.Test1 = fields[0];            ret.Test2 = fields[1];            ret.Test3 = fields[2];            ret.Test4 = fields[3];            ret.Test5 = fields[4];            ret.Test6 = fields[5];            return ret;        }        catch (Exception)        {            //做一些异常处理,写日志之类的            return null;        }    }}

生成一些测试数据,代码如下:

static void Main(string[] args){    //文件保存路径    string path = "tset.csv";    //清理之前的测试文件    File.Delete("tset.csv");          Test test = new Test();    test.Test1 = " 中文,D23 ";    test.Test2 = "3DFD4234\"\"\"1232\"1S2";    test.Test3 = "ASD1\",\"23,,,,213\r23F32";    test.Test4 = "\r";    test.Test5 = string.Empty;    test.Test6 = "asd";    //测试数据    var records = new List<Test> { test, test };    //写CSV文件        //读CSV文件            Console.ReadLine();}

使用CsvHelper

CsvHelper 是用于读取和写入 CSV 文件的库,支持自定义类对象的读写。

GitHub上标星最高的CSV文件读写C#库,使用MS-PL、Apache 2.0开源协议。

使用NuGet下载CsvHelper,读写CSV文件的代码如下:

 //写CSV文件using (var writer = new StreamWriter(path))using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)){    csv.WriteRecords(records);}using (var writer = new StreamWriter(path,true))using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)){    //追加    foreach (var record in records)    {        csv.WriteRecord(record);    }}//读CSV文件using (var reader = new StreamReader(path))using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)){    records = csv.GetRecords<Test>().ToList();    //逐行读取    //records.Add(csv.GetRecord<Test>());}

如果你只想要拿来就能用的库,那文章基本上到这里就结束了。

使用自定义方法

为了与CsvHelper区分,新建一个CsvFile类存放自定义读写CSV文件的代码,最后会提供类的完整源码。CsvFile类定义如下:

/// <summary>/// CSV文件读写工具类/// </summary>public class CsvFile{    #region 写CSV文件    //具体代码...    #endregion    #region 读CSV文件(使用TextFieldParser)    //具体代码...    #endregion    #region 读CSV文件(使用正则表达式)    //具体代码...    #endregion}

基于简化标准的写CSV文件

根据简化标准(具体标准内容见前文),写CSV文件代码如下:

#region 写CSV文件//字段数组转为CSV记录行private static string FieldsToLine(IEnumerable<string> fields){    if (fields == null) return string.Empty;    fields = fields.Select(field =>    {        if (field == null) field = string.Empty;        //简化标准,所有字段都加双引号        field = string.Format("\"{0}\"", field.Replace("\"", "\"\""));        //不简化标准        //field = field.Replace("\"", "\"\"");        //if (field.IndexOfAny(new char[] { ',', '"', ' ', '\r' }) != -1)        //{        //    field = string.Format("\"{0}\"", field);        //}        return field;    });    string line = string.Format("{0}{1}", string.Join(",", fields), Environment.NewLine);    return line;}//默认的字段转换方法private static IEnumerable<string> GetObjFields<T>(T obj, bool isTitle) where T : class{    IEnumerable<string> fields;    if (isTitle)    {        fields = obj.GetType().GetProperties().Select(pro => pro.Name);    }    else    {        fields = obj.GetType().GetProperties().Select(pro => pro.GetValue(obj)?.ToString());    }    return fields;}/// <summary>/// 写CSV文件,默认第一行为标题/// </summary>/// <typeparam name="T"></typeparam>/// <param name="list">数据列表</param>/// <param name="path">文件路径</param>/// <param name="append">追加记录</param>/// <param name="func">字段转换方法</param>/// <param name="defaultEncoding"></param>public static void Write<T>(List<T> list, string path,bool append=true, Func<T, bool, IEnumerable<string>> func = null, Encoding defaultEncoding = null) where T : class{    if (list == null || list.Count == 0) return;    if (defaultEncoding == null)    {        defaultEncoding = Encoding.UTF8;    }    if (func == null)    {        func = GetObjFields;    }    if (!File.Exists(path)|| !append)    {        var fields = func(list[0], true);        string title = FieldsToLine(fields);        File.WriteAllText(path, title, defaultEncoding);    }    using (StreamWriter sw = new StreamWriter(path, true, defaultEncoding))    {        list.ForEach(obj =>        {            var fields = func(obj, false);            string line = FieldsToLine(fields);            sw.Write(line);        });    }}#endregion

使用时,代码如下:

//写CSV文件//使用自定义的字段转换方法,也是文章开头复杂CSV文件使用字段转换方法CsvFile.Write(records, path, true, new Func<Test, bool, IEnumerable<string>>((obj, isTitle) =>{    IEnumerable<string> fields;    if (isTitle)    {        fields = obj.GetType().GetProperties().Select(pro => pro.Name + Environment.NewLine + "\",\"");    }    else    {        fields = obj.GetType().GetProperties().Select(pro => pro.GetValue(obj)?.ToString());    }    return fields;}));//使用默认的字段转换方法//CsvFile.Write(records, path);

你也可以使用默认的字段转换方法,代码如下:

CsvFile.Save(records, path);

使用TextFieldParser解析CSV文件

TextFieldParser是VB中解析CSV文件的类,C#虽然没有类似功能的类,不过可以调用VB的TextFieldParser来实现功能。

TextFieldParser解析CSV文件的代码如下:

#region 读CSV文件(使用TextFieldParser)/// <summary>/// 读CSV文件,默认第一行为标题/// </summary>/// <typeparam name="T"></typeparam>/// <param name="path">文件路径</param>/// <param name="func">字段解析规则</param>/// <param name="defaultEncoding">文件编码</param>/// <returns></returns>public static List<T> Read<T>(string path, Func<string[], T> func, Encoding defaultEncoding = null) where T : class{    if (defaultEncoding == null)    {        defaultEncoding = Encoding.UTF8;    }    List<T> list = new List<T>();    using (TextFieldParser parser = new TextFieldParser(path, defaultEncoding))    {        parser.TextFieldType = FieldType.Delimited;        //设定逗号分隔符        parser.SetDelimiters(",");        //设定不忽略字段前后的空格        parser.TrimWhiteSpace = false;        bool isLine = false;        while (!parser.EndOfData)        {            string[] fields = parser.ReadFields();            if (isLine)            {                var obj = func(fields);                if (obj != null) list.Add(obj);            }            else            {                //忽略标题行业                isLine = true;            }        }    }    return list;}#endregion

使用时,代码如下:

//读CSV文件records = CsvFile.Read(path, Test.Parse);

使用正则表达式解析CSV文件

如果你有一个问题,想用正则表达式来解决,那么你就有两个问题了。

正则表达式有一定的学习门槛,而且学习后不经常使用就会忘记。正则表达式解决的大多数是一些不易变更需求的问题,这就导致一个稳定可用的正则表达式可以传好几代。

本节的正则表达式来自 《精通正则表达式(第3版)》 第6章 打造高效正则表达式&mdash;&mdash;简单的消除循环的例子,有兴趣的可以去了解一下,表达式说明如下:

C#如何实现读写CSV文件

注:这本书最终版的解析CSV文件的正则表达式是Jave版的使用占有优先量词取代固化分组的版本,也是百度上经常见到的版本。不过占有优先量词在C#中有点问题,本人能力有限解决不了,所以使用了上图的版本。不过,这两版正则表达式性能上没有差异。

正则表达式解析CSV文件代码如下:

#region 读CSV文件(使用正则表达式)/// <summary>/// 读CSV文件,默认第一行为标题/// </summary>/// <typeparam name="T"></typeparam>/// <param name="path">文件路径</param>/// <param name="func">字段解析规则</param>/// <param name="defaultEncoding">文件编码</param>/// <returns></returns>public static List<T> Read_Regex<T>(string path, Func<string[], T> func, Encoding defaultEncoding = null) where T : class{    List<T> list = new List<T>();    StringBuilder sbr = new StringBuilder(100);    Regex lineReg = new Regex("\"");    Regex fieldReg = new Regex("\\G(?:^|,)(?:\"((?>[^\"]*)(?>\"\"[^\"]*)*)\"|([^\",]*))");    Regex quotesReg = new Regex("\"\"");    bool isLine = false;    string line = string.Empty;    using (StreamReader sr = new StreamReader(path))    {        while (null != (line = ReadLine(sr)))        {            sbr.Append(line);            string str = sbr.ToString();            //一个完整的CSV记录行,它的双引号一定是偶数            if (lineReg.Matches(sbr.ToString()).Count % 2 == 0)            {                if (isLine)                {                    var fields = ParseCsvLine(sbr.ToString(), fieldReg, quotesReg).ToArray();                    var obj = func(fields.ToArray());                    if (obj != null) list.Add(obj);                }                else                {                    //忽略标题行业                    isLine = true;                }                sbr.Clear();            }            else            {                sbr.Append(Environment.NewLine);            }                           }    }    if (sbr.Length > 0)    {        //有解析失败的字符串,报错或忽略    }    return list;}//重写ReadLine方法,只有\r\n才是正确的一行private static string ReadLine(StreamReader sr) {    StringBuilder sbr = new StringBuilder();    char c;    int cInt;    while (-1 != (cInt =sr.Read()))    {        c = (char)cInt;        if (c == '\n' && sbr.Length > 0 && sbr[sbr.Length - 1] == '\r')        {            sbr.Remove(sbr.Length - 1, 1);            return sbr.ToString();        }        else         {            sbr.Append(c);        }    }    return sbr.Length>0?sbr.ToString():null;}private static List<string> ParseCsvLine(string line, Regex fieldReg, Regex quotesReg){    var fieldMath = fieldReg.Match(line);    List<string> fields = new List<string>();    while (fieldMath.Success)    {        string field;        if (fieldMath.Groups[1].Success)        {            field = quotesReg.Replace(fieldMath.Groups[1].Value, "\"");        }        else        {            field = fieldMath.Groups[2].Value;        }        fields.Add(field);        fieldMath = fieldMath.NextMatch();    }    return fields;}#endregion

使用时代码如下:

//读CSV文件records = CsvFile.Read_Regex(path, Test.Parse);

目前还未发现正则表达式解析有什么bug,不过还是不建议使用。

完整的CsvFile工具类

完整的CsvFile类代码如下:

using Microsoft.VisualBasic.FileIO;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Text.RegularExpressions;namespace ConsoleApp4{    /// <summary>    /// CSV文件读写工具类    /// </summary>    public class CsvFile    {        #region 写CSV文件        //字段数组转为CSV记录行        private static string FieldsToLine(IEnumerable<string> fields)        {            if (fields == null) return string.Empty;            fields = fields.Select(field =>            {                if (field == null) field = string.Empty;                //所有字段都加双引号                field = string.Format("\"{0}\"", field.Replace("\"", "\"\""));                //不简化                //field = field.Replace("\"", "\"\"");                //if (field.IndexOfAny(new char[] { ',', '"', ' ', '\r' }) != -1)                //{                //    field = string.Format("\"{0}\"", field);                //}                return field;            });            string line = string.Format("{0}{1}", string.Join(",", fields), Environment.NewLine);            return line;        }        //默认的字段转换方法        private static IEnumerable<string> GetObjFields<T>(T obj, bool isTitle) where T : class        {            IEnumerable<string> fields;            if (isTitle)            {                fields = obj.GetType().GetProperties().Select(pro => pro.Name);            }            else            {                fields = obj.GetType().GetProperties().Select(pro => pro.GetValue(obj)?.ToString());            }            return fields;        }        /// <summary>        /// 写CSV文件,默认第一行为标题        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="list">数据列表</param>        /// <param name="path">文件路径</param>        /// <param name="append">追加记录</param>        /// <param name="func">字段转换方法</param>        /// <param name="defaultEncoding"></param>        public static void Write<T>(List<T> list, string path,bool append=true, Func<T, bool, IEnumerable<string>> func = null, Encoding defaultEncoding = null) where T : class        {            if (list == null || list.Count == 0) return;            if (defaultEncoding == null)            {                defaultEncoding = Encoding.UTF8;            }            if (func == null)            {                func = GetObjFields;            }            if (!File.Exists(path)|| !append)            {                var fields = func(list[0], true);                string title = FieldsToLine(fields);                File.WriteAllText(path, title, defaultEncoding);            }            using (StreamWriter sw = new StreamWriter(path, true, defaultEncoding))            {                list.ForEach(obj =>                {                    var fields = func(obj, false);                    string line = FieldsToLine(fields);                    sw.Write(line);                });            }        }        #endregion        #region 读CSV文件(使用TextFieldParser)        /// <summary>        /// 读CSV文件,默认第一行为标题        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="path">文件路径</param>        /// <param name="func">字段解析规则</param>        /// <param name="defaultEncoding">文件编码</param>        /// <returns></returns>        public static List<T> Read<T>(string path, Func<string[], T> func, Encoding defaultEncoding = null) where T : class        {            if (defaultEncoding == null)            {                defaultEncoding = Encoding.UTF8;            }            List<T> list = new List<T>();            using (TextFieldParser parser = new TextFieldParser(path, defaultEncoding))            {                parser.TextFieldType = FieldType.Delimited;                //设定逗号分隔符                parser.SetDelimiters(",");                //设定不忽略字段前后的空格                parser.TrimWhiteSpace = false;                bool isLine = false;                while (!parser.EndOfData)                {                    string[] fields = parser.ReadFields();                    if (isLine)                    {                        var obj = func(fields);                        if (obj != null) list.Add(obj);                    }                    else                    {                        //忽略标题行业                        isLine = true;                    }                }            }            return list;        }        #endregion        #region 读CSV文件(使用正则表达式)        /// <summary>        /// 读CSV文件,默认第一行为标题        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="path">文件路径</param>        /// <param name="func">字段解析规则</param>        /// <param name="defaultEncoding">文件编码</param>        /// <returns></returns>        public static List<T> Read_Regex<T>(string path, Func<string[], T> func, Encoding defaultEncoding = null) where T : class        {            List<T> list = new List<T>();            StringBuilder sbr = new StringBuilder(100);            Regex lineReg = new Regex("\"");            Regex fieldReg = new Regex("\\G(?:^|,)(?:\"((?>[^\"]*)(?>\"\"[^\"]*)*)\"|([^\",]*))");            Regex quotesReg = new Regex("\"\"");            bool isLine = false;            string line = string.Empty;            using (StreamReader sr = new StreamReader(path))            {                while (null != (line = ReadLine(sr)))                {                    sbr.Append(line);                    string str = sbr.ToString();                    //一个完整的CSV记录行,它的双引号一定是偶数                    if (lineReg.Matches(sbr.ToString()).Count % 2 == 0)                    {                        if (isLine)                        {                            var fields = ParseCsvLine(sbr.ToString(), fieldReg, quotesReg).ToArray();                            var obj = func(fields.ToArray());                            if (obj != null) list.Add(obj);                        }                        else                        {                            //忽略标题行业                            isLine = true;                        }                        sbr.Clear();                    }                    else                    {                        sbr.Append(Environment.NewLine);                    }                                   }            }            if (sbr.Length > 0)            {                //有解析失败的字符串,报错或忽略            }            return list;        }        //重写ReadLine方法,只有\r\n才是正确的一行        private static string ReadLine(StreamReader sr)         {            StringBuilder sbr = new StringBuilder();            char c;            int cInt;            while (-1 != (cInt =sr.Read()))            {                c = (char)cInt;                if (c == '\n' && sbr.Length > 0 && sbr[sbr.Length - 1] == '\r')                {                    sbr.Remove(sbr.Length - 1, 1);                    return sbr.ToString();                }                else                 {                    sbr.Append(c);                }            }            return sbr.Length>0?sbr.ToString():null;        }               private static List<string> ParseCsvLine(string line, Regex fieldReg, Regex quotesReg)        {            var fieldMath = fieldReg.Match(line);            List<string> fields = new List<string>();            while (fieldMath.Success)            {                string field;                if (fieldMath.Groups[1].Success)                {                    field = quotesReg.Replace(fieldMath.Groups[1].Value, "\"");                }                else                {                    field = fieldMath.Groups[2].Value;                }                fields.Add(field);                fieldMath = fieldMath.NextMatch();            }            return fields;        }        #endregion    }}

使用方法如下:

//写CSV文件CsvFile.Write(records, path, true, new Func<Test, bool, IEnumerable<string>>((obj, isTitle) =>{    IEnumerable<string> fields;    if (isTitle)    {        fields = obj.GetType().GetProperties().Select(pro => pro.Name + Environment.NewLine + "\",\"");    }    else    {        fields = obj.GetType().GetProperties().Select(pro => pro.GetValue(obj)?.ToString());    }    return fields;}));//读CSV文件records = CsvFile.Read(path, Test.Parse);//读CSV文件records = CsvFile.Read_Regex(path, Test.Parse);

关于“C#如何实现读写CSV文件”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: C#如何实现读写CSV文件

本文链接: https://www.lsjlt.com/news/340933.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#如何实现读写CSV文件
    这篇文章主要介绍“C#如何实现读写CSV文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#如何实现读写CSV文件”文章能帮助大家解决问题。CSV文件标准在介绍CSV文件的读写方法前,我们需要了解...
    99+
    2023-07-02
  • C# CSV文件读写如何实现
    这篇文章主要介绍了C# CSV文件读写如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C# CSV文件读写如何实现文章都会有所收获,下面我们一起来看看吧。CSV是一种通用的、相对简单的...
    99+
    2023-07-05
  • C#CSV文件读写的实现
    目录为什么要用csv文件一、DataTable数据写入CSV文件二、读取CSV文件到DataTable三、修改文件名称四、CSV文件的数据写入CSV是一种通用的、相对简单的文件格式,...
    99+
    2023-03-03
    C# CSV文件读写 C# CSV 读写
  • C#实现CSV文件读写的示例详解
    目录CSV文件标准文件示例RFC 4180简化标准读写CSV文件使用CsvHelper使用自定义方法总结项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件的解析。本文会介...
    99+
    2023-05-19
    C#读写CSV文件方法 C#读写CSV文件 C#读写CSV C# CSV
  • C#实现读写CSV文件的方法详解
    目录CSV文件标准文件示例RFC 4180简化标准读写CSV文件使用CsvHelper使用自定义方法总结项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件的解析。本文会介...
    99+
    2022-11-13
  • python读写csv文件的实战
    csv介绍csv是什么?大家估计都听过,不过我猜很少能有人比较全面的解释下的,那么小弟就献丑一下。csv我理解的是一个存储数据的文件,里面以逗号作为分割进行存储(当然也可以用制表符进行分割)。csv的规则1 开头是不留空,以行为单位。2 可...
    99+
    2023-01-31
    实战 文件 python
  • 如何运用python读写CSV文件
    目录1、使用基础Python代码来读写和处理CSV文件2、使用pandas读写和处理CSV文件3、使用内置csv读写和处理CSV文件1、使用基础Python代码来读写和处理CSV文件 import sys #使用...
    99+
    2022-06-02
    python读CSV文件 python读写CSV文件 python CSV文件
  • C\C++如何实现读写二进制文件
    这篇文章主要介绍“C\C++如何实现读写二进制文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C\C++如何实现读写二进制文件”文章能帮助大家解决问题。读写二进制文件打开文件fopen() 函数用...
    99+
    2023-07-05
  • python中csv格式文件如何实现写入与读取
    这篇文章主要为大家展示了“python中csv格式文件如何实现写入与读取”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中csv格式文件如何实现写入与读取”这篇文章吧。csv的简单介绍...
    99+
    2023-06-29
  • 详解C#如何实现读写ini文件
    目录介绍1.创建一个ini文件2.创建一个winform界面3.添加一个ini管理类4.添加winform代码介绍 INI文件格式由节、键、值组成。 节 [section] 参数 (...
    99+
    2022-11-13
  • python中如何读取和写入CSV文件
    本文小编为大家详细介绍“python中如何读取和写入CSV文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“python中如何读取和写入CSV文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。CSV(Comma...
    99+
    2023-07-04
  • Python文本文件与csv文件如何读取与写入
    这篇“Python文本文件与csv文件如何读取与写入”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python文本文件与cs...
    99+
    2023-06-29
  • C++读写(CSV,Yaml,二进制)文件的方法详解
    目录介绍1.读写txt文件2.C++读写CSV文件2.1 写入CSV2.2 读取CSV文件(1)2.3 读取CSV文件(2)2.4 用c++读写二进制文件(1)2.5 用c++读写二...
    99+
    2022-11-13
  • C语言如何实现随机读写文件
    这篇文章主要讲解了“C语言如何实现随机读写文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言如何实现随机读写文件”吧!1.fseek前面已经剧透过了,fseek可以改变记录读写位置的指...
    99+
    2023-07-05
  • C#实现读取写入Json文件
    目录C#读取写入Json文件将数据写入Json文件中Json文件读取Json文件总结C#读取写入Json文件 /// <summary> /// 将序列化...
    99+
    2023-01-28
    C#读取写入Json C#读取Json文件 C#写入Json文件
  • C#怎么实现读写ini文件
    这篇文章主要介绍了C#怎么实现读写ini文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.创建一个C#项目2.创建一个ini文件在Debug目录下创建一个ini文件,写入...
    99+
    2023-06-28
  • python中csv文件的写入与读取怎么实现
    这篇文章主要讲解了“python中csv文件的写入与读取怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中csv文件的写入与读取怎么实现”吧!CSV (Comma Sepa...
    99+
    2023-06-29
  • 如何解决csv文件读写乱码问题
    本篇内容主要讲解“如何解决csv文件读写乱码问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决csv文件读写乱码问题”吧!可能你有类似经历,用excel打开一个csv文件,中文全部显示乱...
    99+
    2023-06-15
  • 如何在python中读取和写入CSV文件
    这篇文章主要介绍“如何在python中读取和写入CSV文件”,在日常操作中,相信很多人在如何在python中读取和写入CSV文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何在python中读取和写入CS...
    99+
    2023-07-02
  • C语言实现读取CSV文件的方法详解
    1、每一次只能读取同一种数据类型,不能读取字符串。 2、第次读取会返回一个 CSV数据结构,有源数据和二维数组,行列数信息 3、可以转换二维数组,但总大小不能变 123.csv M...
    99+
    2022-12-21
    C语言读取CSV文件 C语言读取CSV C语言 CSV
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作