CSV文件导入in.Net

我知道这是一个菜鸟调查,但我正在寻求一个简单的补救措施 - 感觉就像需要一个。

将CSV文件直接导入强类型数据结构的最有效方法是什么? 再一次直截了当=好多了。

0
2019-05-03 18:26:44
资源 分享
答案: 9

如果您预期CSV解析的情况非常复杂, 也不要发明滚动我们自己的解析器 。 周围有很多一流的设备,例如文件助手代码项目的设备。

原因是这是一个很平常的麻烦,您也可以下注 很多 的软件程序程序员目前实际上已经想到并解决了此问题。

0
2019-12-03 04:04:12
资源

我同意@ 不是我自己文件助手经过了充分的检查,还可以处理您自己进行管理时需要管理的各种附带实例。 看一下FileHelpers的功能,如果可以肯定地确定(1)您将永远不需要照顾FileHelpers的其他实例,或者(2)您喜欢创建这种类型的文件,也只需编写自己的文件当您需要解析类似于以下内容的内容时,这些内容也很可能会被打勾:

1,“比尔”,“史密斯”,“主管”,“无评论”

2,“德雷克”,“奥马利”,“看门人”

糟糕,我没有估算价格,而且我正在换行!

0
2019-12-03 04:03:55
资源

今年夏天,我需要在.NET中使用CSV解析器来完成任务,并且还决定使用Microsoft Jet文本驱动程序。 您可以使用链接字符串定义一个文件夹,然后使用SQL Select声明对文件进行测验。 您可以使用schema.ini文件定义实体种类。 我一开始确实没有这样做,但是在那之后,我获得了负面的结果,其中的信息种类不能很快被注意到,例如IP号码或“ XYQ 3.9 SP1”之类的访问。

我面临的一个限制是它不能处理超过64个个性的列名; 它修剪。 除了我管理的输入信息确实不足之外,这应该不成问题。 它返回一个ADO.NET数据集。

这是我找到的最有效的补救措施。 我肯定会提防滚动自己的CSV解析器,因为我可能会错过几个完成实例,而且我真的没有为.NET找到任何其他各种免费的CSV解析计划。

编辑:另外,每个目录站点只能有一个schema.ini文件,因此我将其动态添加到其中以高度键入所需的列。 它将只是高度-键入已定义的列,并假定存在任何类型的未定义区域。 我实际上很重视这一点,因为我正在设法导入液态70列以上的CSV,而且实际上也并不打算定义每个列,而只是定义行为不当的列。

0
2019-12-03 03:33:41
资源

布莱恩提供了一个很好的补救措施,可以将它转变为高调的收藏品。

提供的许多CSV解析方法都没有考虑丢失区域或CSV文档的各种其他细微差别(如切割区域)。 下面是我直接使用的代码。 双方都有点苛刻,几乎没有错误的报道。

public static IList<IList<string>> Parse(string content)
{
    IList<IList<string>> records = new List<IList<string>>();

    StringReader stringReader = new StringReader(content);

    bool inQoutedString = false;
    IList<string> record = new List<string>();
    StringBuilder fieldBuilder = new StringBuilder();
    while (stringReader.Peek() != -1)
    {
        char readChar = (char)stringReader.Read();

        if (readChar == '\n' || (readChar == '\r' && stringReader.Peek() == '\n'))
        {
            // If it's a \r\n combo consume the \n part and throw it away.
            if (readChar == '\r')
            {
                stringReader.Read();
            }

            if (inQoutedString)
            {
                if (readChar == '\r')
                {
                    fieldBuilder.Append('\r');
                }
                fieldBuilder.Append('\n');
            }
            else
            {
                record.Add(fieldBuilder.ToString().TrimEnd());
                fieldBuilder = new StringBuilder();

                records.Add(record);
                record = new List<string>();

                inQoutedString = false;
            }
        }
        else if (fieldBuilder.Length == 0 && !inQoutedString)
        {
            if (char.IsWhiteSpace(readChar))
            {
                // Ignore leading whitespace
            }
            else if (readChar == '"')
            {
                inQoutedString = true;
            }
            else if (readChar == ',')
            {
                record.Add(fieldBuilder.ToString().TrimEnd());
                fieldBuilder = new StringBuilder();
            }
            else
            {
                fieldBuilder.Append(readChar);
            }
        }
        else if (readChar == ',')
        {
            if (inQoutedString)
            {
                fieldBuilder.Append(',');
            }
            else
            {
                record.Add(fieldBuilder.ToString().TrimEnd());
                fieldBuilder = new StringBuilder();
            }
        }
        else if (readChar == '"')
        {
            if (inQoutedString)
            {
                if (stringReader.Peek() == '"')
                {
                    stringReader.Read();
                    fieldBuilder.Append('"');
                }
                else
                {
                    inQoutedString = false;
                }
            }
            else
            {
                fieldBuilder.Append(readChar);
            }
        }
        else
        {
            fieldBuilder.Append(readChar);
        }
    }
    record.Add(fieldBuilder.ToString().TrimEnd());
    records.Add(record);

    return records;
}

请注意,这并没有考虑到没有用双引号区分的区域的边实例,但是meerley实际上有一个定价的估计字符串。 请参阅这个帖子,以及更好的扩展,以及一些指向某些正确集合的Web链接。

0
2019-05-22 12:25:23
资源

我被烧了所以我改变了一些我创造的东西。 它试图以OO方式包含解析,通过文件降低模型的数量,它只是在最前面的时候重复。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {

            // usage:

            // note this wont run as getting streams is not Implemented

            // but will get you started

            CSVFileParser fileParser = new CSVFileParser();

            // TO Do:  configure fileparser

            PersonParser personParser = new PersonParser(fileParser);

            List<Person> persons = new List<Person>();
            // if the file is large and there is a good way to limit
            // without having to reparse the whole file you can use a 
            // linq query if you desire
            foreach (Person person in personParser.GetPersons())
            {
                persons.Add(person);
            }

            // now we have a list of Person objects
        }
    }

    public abstract  class CSVParser 
    {

        protected String[] deliniators = { "," };

        protected internal IEnumerable<String[]> GetRecords()
        {

            Stream stream = GetStream();
            StreamReader reader = new StreamReader(stream);

            String[] aRecord;
            while (!reader.EndOfStream)
            {
                  aRecord = reader.ReadLine().Split(deliniators,
                   StringSplitOptions.None);

                yield return aRecord;
            }

        }

        protected abstract Stream GetStream(); 

    }

    public class CSVFileParser : CSVParser
    {
        // to do: add logic to get a stream from a file

        protected override Stream GetStream()
        {
            throw new NotImplementedException();
        } 
    }

    public class CSVWebParser : CSVParser
    {
        // to do: add logic to get a stream from a web request

        protected override Stream GetStream()
        {
            throw new NotImplementedException();
        }
    }

    public class Person
    {
        public String Name { get; set; }
        public String Address { get; set; }
        public DateTime DOB { get; set; }
    }

    public class PersonParser 
    {

        public PersonParser(CSVParser parser)
        {
            this.Parser = parser;
        }

        public CSVParser Parser { get; set; }

        public  IEnumerable<Person> GetPersons()
        {
            foreach (String[] record in this.Parser.GetRecords())
            {
                yield return new Person()
                {
                    Name = record[0],
                    Address = record[1],
                    DOB = DateTime.Parse(record[2]),
                };
            }
        }
    }
}
0
2019-05-13 14:29:09
资源

如果您可以确保信息中没有逗号,那么最基本的方法可能是使用String.split

举个例子 :

String[] values = myString.Split(',');
myObject.StringField = values[0];
myObject.IntField = Int32.Parse(values[1]);

您可以使用可以使用的集合来提供帮助,但这可能会让您尽可能直截了当。 简单地看一下,你不能在信息中使用逗号,否则你肯定需要更好地解析它。

0
2019-05-08 15:49:07
资源

CodeProject上有2个文章,它们提供了补救措施的代码,一个使用StreamReader的的代码,另一个是导入CSV数据使用Microsoft文本驱动程序的代码。

0
2019-05-08 15:28:52
资源
0
2019-05-08 15:09:07
资源

一个非常简单明了的方法是打开文件,并将每一行读入一个数组,连接清单,信息框架 - 你的选择。 但要注意照顾第一线。

这可能比你的头脑更多,但似乎有一种直接的方式来访问它们也使用连接字符串

为什么不尝试使用Python而不是C#或VB? 它有一个很棒的CSV组件可以导入,为您完成所有重要的培训。

0
2019-05-08 14:57:30
资源