好的,我有一个二进制文件,需要能够从 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);
}
}
}
答案 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/BinarySerializer和https://joshclose.github.io/CsvHelper/
您读取的文件示例看起来不像 csv,所以也许您应该考虑使用 https://github.com/mikeacjones/FixedWidthFileUtils 之类的东西来读取文件