微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

二进制文件读写

如何解决二进制文件读写

好的,我有一个二进制文件,需要能够从 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,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",FileAccess.Write);
            foreach (var person in persons)
            {
                serializer.Serialize(file,person);
            }
        }
    }

解决方法

你可以尝试类似的东西

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 之类的东西来读取文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?