【问题标题】:how to read csv file record verically如何垂直读取csv文件记录
【发布时间】:2015-06-18 09:18:49
【问题描述】:

我想将以下文件数据导入数据库中

 Id    Name 
10001 Hemant Desai

作为常规表格数据,我如何读取这些数据,我对此感到有些困惑。

这里是csv文件数据......

ID=,10001,
Name=,Hemant Desai, 
Age=,60,
Sex=,male,
Doctor=,Pathak,
Mobile=,9021412202,
Alignment=,brain tumour,
No of medicins=,3,
12:02,Stamlo-5,1mg,oral,after meal,*XE0280916*
12:01,Atorfit-CV-10,4mg,oral,after meal,*XE0283337*
12:01,Losar,3mg,oral,after meal,*XE0284350*
12:02,Appointment,X ray of right chest at 11.00 am on Wed 11th Dec
12:01,procedure,Sponge patient with warm water
Temperature =,222
Blood Pressure =, 555/555
Pulse Rate =, 555
Respiratory Rate =, 999

并且在 No of medicin 字段中,我必须将所有数据写入温度字段,并在它们之间放置 quamma 并删除所有 = 符号

我尝试了以下代码

公共无效导入() { 尝试 { con.Open(); string sourceDir = @"目录路径"; var IcsvFile = Directory.EnumerateFiles(sourceDir, "*.csv"); 数据表 dt = 新数据表(); //字符串第1行,第8行;

            foreach (string currentFile in IcsvFile)
            {
                //string filename = @"FullFileNameWithPath.csv";
                //get all lines from csv file
                string[] lines = File.ReadAllLines(currentFile);
                //get only id's
                var ids = lines
                    .Where(a => a.Trim() != string.Empty && a.Contains("ID="))
                    .Select((a, x) => new { ID = Convert.ToInt32(a.Split(',')[1]), index = x });
                //get names
                var names = lines
                    .Where(a => a.Trim() != string.Empty && a.Contains("Name="))
                    .Select((a, x) => new { Name = a.Split(',')[1], index = x });
                //get patiens; join ids and names on index
                var patients = from id in ids
                               join name in names on id.index equals name.index
                               select new
                               {
                                   ID = id.ID,
                                   Name = name.Name
                               };
                foreach (var p in patients)
                {
                    Console.WriteLine("{0}\t{1}", p.ID, p.Name);
                }

                //DataTable dt = new DataTable();
                //DataRow row;

                //using (StreamReader sr = new StreamReader(currentFile))
                //{
                //    line1 = sr.ReadLine();
                //    line8 = sr.ReadLine();
                //}
            }

        }

【问题讨论】:

  • 你试过了吗?
  • 查看我编辑的答案。

标签: c#


【解决方案1】:

您可能知道,这不是使用 csv 存储数据的正确方法。您将必须编写一个代码来遍历 csv 的每一行并对其进行解析。 首先使用System.IO.File.ReadAllLines(FilePath) 将整个文件读入字符串数组,然后分析字符串。我建议使用DataTable(假设您的列名是固定的)请注意,您必须检查数组中的每个字符串是否包含= 字符,如果包含,那么这个字符之前的内容是列名及其后面的任何内容作为数据。如果没有,请使用最后一列并将整行的数据附加到当前数据。

完成后,您应该有一个DataTable,其中包含“csv”文件中的所有数据。然后您所要做的就是将其发送到一个存储过程,该过程将添加或更新数据库中的数据。

这是我可能会做的:

    private DataTable ReadFiles(string sourceDir)
    {
        var IcsvFile = Directory.EnumerateFiles(sourceDir, "*.csv");
        DataTable dt = new DataTable();
        dt.Columns.Add("Id", System.Type.GetType("System.Int32"));
        dt.Columns.Add("Name", System.Type.GetType("System.String"));
        dt.Columns.Add("Age", System.Type.GetType("System.Int32"));
        dt.Columns.Add("Sex", System.Type.GetType("System.String")); // Gender in proper english 
        dt.Columns.Add("Doctor", System.Type.GetType("System.String"));
        dt.Columns.Add("Mobile", System.Type.GetType("System.String"));
        dt.Columns.Add("Alignment", System.Type.GetType("System.String"));
        dt.Columns.Add("No of medicins", System.Type.GetType("System.String"));
        dt.Columns.Add("Temperature ", Type.GetType("System.Int32"));
        dt.Columns.Add("Blood Pressure", System.Type.GetType("System.String"));
        dt.Columns.Add("Pulse Rate", System.Type.GetType("System.String"));
        dt.Columns.Add("Respiratory Rate", System.Type.GetType("System.Int32"));
        foreach (string currentFile in IcsvFile)
        {
            ImportSingleFile(currentFile, ref dt);
        }
        return dt;
    }

    private void ImportSingleFile(string FilePath, ref DataTable dt)
    {
        string[] Lines = File.ReadAllLines(FilePath);
        string ColumnName, ColumnData;
        int EqualSignIndex, intColumnData;
        DataRow Row = null;
        ColumnName = string.Empty;
        foreach (string Line in Lines)
        {
            EqualSignIndex = Line.IndexOf("=");
            if (EqualSignIndex > -1)
            {
                ColumnName = Line.Substring(0, EqualSignIndex);
                // after = there is always , that we don't want in the data, 
                // and the line sometimes ends with a , that we also don't want
                ColumnData = Line.Substring(EqualSignIndex + 2).TrimEnd(','); 
            }
            else
            {
                ColumnData = Line;
            }

            if (ColumnName == "ID")
            {
                Row = dt.NewRow();
            }

            if (Row != null)
            {
                if(dt.Columns[ColumnName].DataType == Type.GetType("System.Int32")) {
                    if(int.TryParse(ColumnData, out intColumnData)) 
                    {
                        Row[ColumnName] = intColumnData;
                    } else {
                        throw new InvalidDataException(string.Format("For column {0} an integer value is expected", ColumnName));
                    }
                } else {
                    Row[ColumnName] = ColumnData;
                }                   
            }
        }
    }

之后,您应该拥有完整的数据表,并且应该很容易从中插入/更新数据库。

【讨论】:

  • 先生如何将此 dt 分配给我的数据表
  • 这取决于您的数据库。如果您正在使用 sql server,您可以编写一个存储过程,从 c# 中按原样接受 dataTable 并在数据库中插入/更新相关表。
  • 是的,我使用 sql 数据库,所以这个数据表是如何在存储过程中接受的,我没有找到特殊的方式
  • 它有点愚蠢的问题我知道 bt cn 你告诉我我在哪里编写用于在 sql server 2008 中创建用户定义类型的代码。因为在数据库的这个类型部分中没有创建新类型的选项。
猜你喜欢
  • 2021-01-13
  • 2022-01-08
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多