如何解决二进制文件读写
好的,我有一个二进制文件,需要能够从 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/BinarySerializer和https://joshclose.github.io/CsvHelper/
您读取的文件示例看起来不像 csv,所以也许您应该考虑使用 https://github.com/mikeacjones/FixedWidthFileUtils 之类的东西来读取文件
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。