二进制文件读写

时间:2021-03-04 23:47:25

标签: c# binary

好的,我有一个二进制文件,需要能够从 csv 数据读取然后写入数据。

我有大约 12k 条记录需要从 csv 转换为二进制,这对我个人来说很难理解。任何帮助,将不胜感激。我正在使用带有 Visual Studio 的 C#。

这是我正在阅读的文件

                                                                                                                                                                                                                                                                                                                                                                                                                                                                            310         KEITH                                   SFGEH6                                                                          BRENTWOOD                               CA 90049                                                                                                                                                                        å¤_                    š™ÏA                                                                                   310         KEITH                                   OSAD                                    SDNVCS                                  BRENTWOOD                               CA 90049                                                                                                                                                                        ¤_                      B                                                                                   310         57I M4                                  8M4M8                                   8M                                      BRENTWOOD                               CA 90049                                                                                                                                                                        ?¤_                      8A                                                                                   310         WERTHWR                                 SFGHERH                                                                         BRENTWOOD                               CA 90049                                                                                                                                                                        À¤_                      B                                                                                   310         HMDFGH                                  ADGNBSFDGNFS                                                                    BRENTWOOD                               CA 90049                                                                                                                                                                        ö¤_                      LB                                                                                   310         GHMNDGMH                                SFMSFGHMNS                                                                      BRENTWOOD                               CA 90049                                                                                                                                                                        ¤_                      8B                                                                                   310         FGSXFDGH                                SDGHSDHG                                                                        BRENTWOOD                               CA 90049                                                                                                                                                                        þ$¤_                      ˜A                                                                                   310         HTAH                                    AFGHBADF                                                                        BRENTWOOD                               CA 90049                                                                                                                                                                        &¤_                      ÈA                                                                                   310         ADHAD                                   ADGH                                                                            BRENTWOOD                               CA 90049                                                                                                                                                                        ©)¤_                      |B                                                                                   310         TYDJU                                   DGTJ                                                                            BRENTWOOD                               CA 90049                                                                                                                                                                        &*¤_                      °B                                                                                   310         E57IE5                                  ETUI                                                                            BRENTWOOD                               CA 90049                                                                                                                                                                        J,¤_                    ÍÌ\@                                                                                   207                                                                                                                                 TOP                                     ME 04011 

这是我被告知的结构。 每条记录具有以下结构: #define DELIVERY_MAX_HISTORY 6

#pragma pack(push,1)
typedef struct 
{
  char area_code[4];
    char phone[8];
    char name[40];
    char address1[40];
    char address2[40];
    char city[40];
    char state[3];
    char zip[13];
    char directions1[40];
    char directions2[40];
    char comment1[40];
    char comment2[40];
    unsigned long last_order_dates[DELIVERY_MAX_HISTORY];
    float last_order_totals[DELIVERY_MAX_HISTORY];
    short last_order_check_num[DELIVERY_MAX_HISTORY];
    char has_bad_checks;
    char ext[10];   // Currently only 4 bytes are allowed
    char Zone[10];  // not unused
    char extra[31];
 } delivery_data_type;
#pragma pack(pop)

好的,已经把它放在一起了,但我没有数据输出到 .bin 文件。 它只是坐着跑跑

 class Program
{
    static void Main(string[] args)
    {

        using(var reader = new StreamReader(@"c:\test\custdel.csv"))
        Console.WriteLine("DELIVERY Converter");
        var serializer = new BinarySerializer();
        using var csv = new CsvReader(Console.In, CultureInfo.InvariantCulture);
        var persons = csv.GetRecords<Person>();
        using var file = new FileStream("out.bin", FileMode.Create, FileAccess.Write);
        foreach (var person in persons)
        {
            serializer.Serialize(file, person);
        }
    }


    public class Person
    {
        [FieldOrder(0)]  // from BinarySerialization
        public string areacode { get; set; }

        [FieldOrder(1)]
        public string phone { get; set; }

        [FieldOrder(2)]
        public int name { get; set; }

        [FieldOrder(3)]
        public string ddress1 { get; set; }

        [FieldOrder(4)]
        public int address2 { get; set; }

        [FieldOrder(5)]
        public string city { get; set; }

        [FieldOrder(6)]
        public int state { get; set; }

        [FieldOrder(7)]
        public string zip { get; set; }

        [FieldOrder(8)]
        public int directions1 { get; set; }

        [FieldOrder(9)]
        public string directions2 { get; set; }

        [FieldOrder(10)]
        public int comment1 { get; set; }
        [FieldOrder(11)]
        public string comment2 { get; set; }

        [FieldOrder(12)]
        public int has_bad_checks { get; set; }

        [FieldOrder(13)]
        public string ext { get; set; }

        [FieldOrder(14)]
        public int Zone { get; set; }
        [FieldOrder(15)]
        public string extra { get; set; }

       
    }
}

这是csv文件

FieldOrder(0),FieldOrder(1),FieldOrder(2),FieldOrder(3),FieldOrder(4),FieldOrder(5),FieldOrder(6),FieldOrder(7),FieldOrder(8),FieldOrder(9),FieldOrder(10),FieldOrder(11),FieldOrder(12),FieldOrder(13),FieldOrder(14),FieldOrder(15)

207,207-210-2127,ADRIAN,160 COLUMBIA AVE,,BRUNSWICK,ME,4011,,,,,,,, 207,446-1989,ANNA,16 BRUNSWICK STATION,,BRUNSWICK,ME,,secondfloor,,,,,,,

好的,我已经发现了这个问题并解决了,然后继续下一个。 在“foreach (var person in person)”中调试时出错 这就是我得到的错误 CsvHelper.TypeConversion.TypeConverterException: '无法执行转换。 文字:'姓名' 成员类型:System.Int32 类型转换器:'CsvHelper.TypeConversion.Int32Converter' 阅读器状态: 列数:0 当前索引:2 标题记录:

我的代码也发生了变化,我从 csv 文件中删除了标题,因为我在标题上遇到了另一个错误:

 {

        Console.WriteLine("DELIVERY Converter");

        var config = new CsvConfiguration(CultureInfo.InvariantCulture)
        {
            HasHeaderRecord = false,
        };

        using (var reader = new StreamReader(@"c:\test\custdel.csv"))
        using (var csv = new CsvReader(reader, config))
        {
            var persons = csv.GetRecords<Person>();

            var serializer = new BinarySerializer();

            using var file = new FileStream("out.bin", FileMode.Create, FileAccess.Write);
            foreach (var person in persons)
            {
                serializer.Serialize(file, person);
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

你可以尝试类似的东西

using BinarySerialization;
using CsvHelper;
...
    public class Person
    {
        [FieldOrder(0)]  // from BinarySerialization
        public string FirstName { get; set; }

        [FieldOrder(1)]
        public string LastName { get; set; }

        [FieldOrder(2)]
        public int ID { get; set; }
    }

    private static void Main()
    {
        var serializer = new BinarySerializer();
        using var csv = new CsvReader(Console.In, CultureInfo.InvariantCulture);
        var persons = csv.GetRecords<Person>();
        using var file = new FileStream("out.bin", FileMode.Create, FileAccess.Write);
        foreach (var person in persons)
        {
            serializer.Serialize(file, person);
        }
    }

它从标准输入读取 cvs 并将二进制表示写入 out.bin

详情见https://github.com/jefffhaynes/BinarySerializerhttps://joshclose.github.io/CsvHelper/

您读取的文件示例看起来不像 csv,所以也许您应该考虑使用 https://github.com/mikeacjones/FixedWidthFileUtils 之类的东西来读取文件

相关问题