简体   繁体   English

二进制文件读写

[英]Binary file read write

OK I have a binary file that needs to be able to read and then write to from csv data.好的,我有一个二进制文件,需要能够从 csv 数据读取然后写入。

I have about 12k records that needs to converted from csv to binary, This hard for me to wrap my head around it personally.我有大约 12k 条记录需要从 csv 转换为二进制文件,这让我个人难以理解。 Any help would be appreciated.任何帮助,将不胜感激。 C# with visual studio is what I am using.我正在使用带有 Visual Studio 的 C#。

This is the file that I am reading这是我正在阅读的文件

                                                                                                                                                                                                                                                                                                                                                                                                                                                                            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 

and this is the structure I am told.这就是我被告知的结构。 Each record has the following structure: #define DELIVERY_MAX_HISTORY 6每条记录的结构如下:#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)

OK so have put this together but I have no data output to the.bin file.好的,所以把它放在一起,但我没有数据 output 到 .bin 文件。 it just sits and run and runs它只是坐着跑着跑着

 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; }

       
    }
}

and this is the csv file这是 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,,,,,,, 207,207-210-2127,ADRIAN,160 COLUMBIA AVE,,BRUNSWICK,ME,4011,,,,,,,,, 207,446-1989,ANNA,16 BRUNSWICK STATION,,BRUNSWICK,ME,,二楼,,,,,,,

ok I have found that problem and resolved and on to the next one.好的,我发现了这个问题并解决了,然后继续下一个问题。 Getting an error when debugging at the "foreach (var person in person)" and this is what I am getting for the error CsvHelper.TypeConversion.TypeConverterException: 'The conversion cannot be performed.在“foreach (var person in person)”调试时出错,这就是我得到的错误 CsvHelper.TypeConversion.TypeConverterException: '无法执行转换。 Text: 'name' MemberType: System.Int32 TypeConverter: 'CsvHelper.TypeConversion.Int32Converter' IReader state: ColumnCount: 0 CurrentIndex: 2 HeaderRecord:文本:'name' MemberType:System.Int32 TypeConverter:'CsvHelper.TypeConversion.Int32Converter' IReader state:ColumnCount:0 CurrentIndex:2 HeaderRecord:

and my code change also and I removed the header from the csv file as I was getting another error on the headers:我的代码也发生了变化,我从 csv 文件中删除了 header,因为我在标题上遇到了另一个错误:

 {

        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);
            }
        }
    }

You could try something like你可以尝试类似的东西

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);
        }
    }

It reads cvs from standard input and write binary representation to out.bin它从标准输入读取 cvs 并将二进制表示写入 out.bin

See https://github.com/jefffhaynes/BinarySerializer and https://joshclose.github.io/CsvHelper/ for details有关详细信息,请参阅https://github.com/jefffhaynes/BinarySerializerhttps://joshclose.github.io/CvHelper/

Example of file that you reading looks not like csv, so maybe you should consider something like https://github.com/mikeacjones/FixedWidthFileUtils to read file您阅读的文件示例看起来不像 csv,所以也许您应该考虑使用 https://github.com/mikeacjones/FixedWidthFileUtils 之类的东西来读取文件

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM