CSV文件解析

qacovj5a  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(226)

由于这是第一个讨论主题,如果我说错了,请事先原谅我。我的问题是,我有一个CSV文件的例子,格式为'.txt',我正在使用这个文件。

  • 名称名称名称
  • 地址
  • 方向
  • 状态
  • 持续时间
  • 日期

我想得到这样的值。我用了CSVHelper,要么我做不到,要么我想要的格式不在那个包里。提前感谢那些帮助我的人。附件是我想解析的文件;

**Name,Address,Direction,Status,Duration,Date**
Berat Bey Dörtsan,"05315554622",Outgoing,Unanswered,00:00,00:00,8/4/2022 (9:25:48 AM)
Berat Bey Dörtsan,"05315554622",Outgoing,Answered,00:47,00:47,8/4/2022 (9:27:55 AM)
Berat Bey Dörtsan,"05315554622",Incoming,Answered,00:54,00:54,8/4/2022 (9:35:02 AM)
Berat Bey Dörtsan,"05315554622",Outgoing,Answered,00:19,00:19,8/4/2022 (2:58:43 PM)
Berat Bey Dörtsan,"05315554622",Outgoing,Answered,00:49,00:49,8/5/2022 (9:21:52 AM)
Berat Bey Dörtsan,"05315554622",Incoming,Answered,01:56,01:56,8/16/2022 (10:17:55 AM)
Berat Bey Dörtsan,"05315554622",Outgoing,Answered,00:47,00:47,9/7/2022 (11:02:33 AM)
Berat Bey Dörtsan,"05315554622",Outgoing,Answered,01:19,01:19,9/7/2022 (11:04:35 AM)
Berat Bey Dörtsan,"05315554622",Outgoing,Answered,01:57,01:57,9/7/2022 (11:07:20 AM)
Berat Bey Dörtsan,"05315554622",Outgoing,Answered,04:59,04:59,9/7/2022 (11:12:54 AM)
Berat Bey Dörtsan,"05315554622",Outgoing,Answered,01:50,01:50,9/7/2022 (11:18:36 AM)
Berat Bey Dörtsan,"05315554622",Incoming,Answered,00:37,00:37,9/7/2022 (11:36:36 AM)
Berat Bey Dörtsan,"05315554622",Outgoing,Answered,00:59,00:59,9/7/2022 (11:55:19 AM)
Berat Bey Dörtsan,"05315554622",Incoming,Missed,00:00,00:00,9/7/2022 (12:15:26 PM)
Berat Bey Dörtsan,"05315554622",Outgoing,Unanswered,00:00,00:00,9/7/2022 (12:21:12 PM)
Berat Bey Dörtsan,"05315554622",Outgoing,Unanswered,00:00,00:00,9/7/2022 (12:21:24 PM)
Berat Bey Dörtsan,"05315554622",Outgoing,Answered,00:18,00:18,9/7/2022 (12:36:08 PM)

我试着这样做,

  • 姓名=贝拉特Bey Dörtsan
  • 地址= 05315554466
  • 方向=传出
  • 状态=未答复
  • 持续时间= 00:54 - 01:56
  • 日期= 2022年8月4日(上午9:25:48)

我用的是这些代码

using CsvHelper;
using CsvHelper.Configuration.Attributes;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TextVeriCekme
{
    public partial class Form1 : Form
    {
        String csvPath = "";
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog
            {
                Title = "CSV Dosyası Aç",
                Filter = "csv files (*.csv)|*.csv",
                CheckFileExists = true,
                CheckPathExists = true
            };

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                MessageBox.Show(ofd.FileName);
                csvPath = ofd.FileName;
            }
        }

        public class Foo
        {
            public string Name { get; set; }

            public string Address { get; set; }

            public string Direction { get; set; }

            public string Status { get; set; }

            public string Duration { get; set; }

            [Name("Date")]
            [Format("dd-MM-yyyy")]
            public DateTime Date { get; set; }
        }

        int sayac = 0;

        private void button2_Click(object sender, EventArgs e)
        {
            IEnumerable<Foo> records = null;
            List<Foo> list = null;
            using (var reader = new StreamReader(csvPath))
                using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
            {
                records = csv.GetRecords<Foo>();
                list = records.ToList();
                MessageBox.Show("Toplam Kayıt : " + records.Count().ToString());
                foreach (Foo record in list)
                {
                    if (sayac == 1)
                    {
                        MessageBox.Show(record.Name);
                        MessageBox.Show(record.Address);
                        MessageBox.Show(record.Direction);
                        MessageBox.Show(record.Status);
                        MessageBox.Show(record.Duration);
                        MessageBox.Show(record.Date.ToString());
                    }
                    sayac++;
                }
            }
        }
    }
}

这样我就不能得到'日期'变量。我想做的一般是一个窗口形式来保持这些通话记录(日期和时间)。

ne5o7dgx

ne5o7dgx1#

Foo类型中日期的格式修饰错误。日期值如下所示:

M/d/yyyy (h:mm:ss tt)

因此需要相应地修饰类型:

public class Foo
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string Direction { get; set; }
    public string Status { get; set; }
    public string Duration { get; set; }

    [Name("Date")]
    [Format("M/d/yyyy (h:mm:ss tt)")]
    public DateTime Date { get; set; }
}

如果您无法更改该属性,则需要提供ClassMap配置,如下所示:
https://stackoverflow.com/a/62536666/3043

xwbd5t1u

xwbd5t1u2#

问题的一部分是Duration是数据中的两列,因为它没有用双引号括起来。
00:47,00:47而不是"00:47,00:47"
因此,您不能通过头名称,而是需要使用ClassMap来通过IndexMap属性。

void Main()
{
    using (var reader = new StreamReader(@"C:\Temp\CsvFileParsing.txt"))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        csv.Context.RegisterClassMap<FooMap>();
        
        var records = csv.GetRecords<Foo>().ToList();
    }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(x => x.Name).Index(0);
        Map(x => x.Address).Index(1);
        Map(x => x.Direction).Index(2);
        Map(x => x.Status).Index(3);
        Map(x => x.Duration).Convert(args => args.Row.GetField(4) + " - " + args.Row.GetField(5));
        Map(x => x.Date).Index(6).TypeConverterOption.Format("M/d/yyyy (h:mm:ss tt)");
    }
}

public class Foo
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string Direction { get; set; }
    public string Status { get; set; }
    public string Duration { get; set; }
    public DateTime Date { get; set; }
}

相关问题