C# 验证要从.BIN文件添加到DataGridView的潜在新行 忽略/跳过第一条常量记录,该记录包含店铺id、位置和打开日期等信息。。。阅读其余信息(如购买id、商品名称、购买日期等信息)。。。
我正在创建一个解码.bin文件并将信息显示到DataGridView表中的应用程序。选择行后,更多信息将显示在其他字段中。但是,不需要的数据总是添加到每个文件的第一行,有时添加到最后一行。我想验证它,并仅在验证通过时显示。我的代码只是添加了一些转换后看到的内容。当用户选择要导入的文件时,将调用方法Info_to_表C# 验证要从.BIN文件添加到DataGridView的潜在新行 忽略/跳过第一条常量记录,该记录包含店铺id、位置和打开日期等信息。。。阅读其余信息(如购买id、商品名称、购买日期等信息)。。。,c#,winforms,visual-studio,datagridview,.net-3.5,C#,Winforms,Visual Studio,Datagridview,.net 3.5,我正在创建一个解码.bin文件并将信息显示到DataGridView表中的应用程序。选择行后,更多信息将显示在其他字段中。但是,不需要的数据总是添加到每个文件的第一行,有时添加到最后一行。我想验证它,并仅在验证通过时显示。我的代码只是添加了一些转换后看到的内容。当用户选择要导入的文件时,将调用方法Info_to_表 byte[] rec_arr = new byte[32767]; private void Info_to_Table() { rec_arr = File.ReadAll
byte[] rec_arr = new byte[32767];
private void Info_to_Table()
{
rec_arr = File.ReadAllBytes(import.FileName);
FileInfo fi = new FileInfo(import.FileName);
long length = fi.Length;
long count = 0;
using (FileStream Fs = new FileStream(import.FileName, FileMode.Open, FileAccess.Read))
using (BinaryReader Br = new BinaryReader(Fs))
{
// Read other info here
while ((length = Br.Read(rec_arr, (int)0, 1024)) > 0) *
{
// Read other info here
Dgv.Rows.Add(DecodeLong(rec_arr, 4), count++, DecodeDateTime(rec_arr, 28));
}
Br.Close();
Fs.Close();
}
}
选择记录(行)时:
private void Dgv_SelectionChanged(object sender, EventArgs e)
{
To_Fields();
}
private void To_Fields()
{
rec_arr = File.ReadAllBytes(import.FileName);
FileInfo file_info_bin = new FileInfo(import.FileName);
long length_bin = file_info_bin.Length;
int rec_num_to_read = Dgv.CurrentRow.Index;
using (FileStream FS = new FileStream(import.FileName, FileMode.Open, FileAccess.Read))
using (BinaryReader BR = new BinaryReader(FS))
{
do
{
FS.Seek(rec_num_to_read * 1024, SeekOrigin.Begin);
// Read other info here!
Status(rec_arr);
foreach (var rec in rec_arr)
{
rec_num_to_read++;
}
}
while ((length_bin = BR.Read(rec_arr, 0, 1024)) > 0);
BR.Close();
FS.Close();
}
}
每次选择记录时:
private void Dgv_SelectionChanged(object sender, EventArgs e)
{
To_Fields();
}
private void To_Fields()
{
rec_arr = File.ReadAllBytes(import.FileName);
FileInfo file_info_bin = new FileInfo(import.FileName);
long length_bin = file_info_bin.Length;
int rec_num_to_read = Dgv.CurrentRow.Index;
using (FileStream FS = new FileStream(import.FileName, FileMode.Open, FileAccess.Read))
using (BinaryReader BR = new BinaryReader(FS))
{
do
{
FS.Seek(rec_num_to_read * 1024, SeekOrigin.Begin);
// Read other info here!
Status(rec_arr);
foreach (var rec in rec_arr)
{
rec_num_to_read++;
}
}
while ((length_bin = BR.Read(rec_arr, 0, 1024)) > 0);
BR.Close();
FS.Close();
}
}
在填充表之前,是否有方法验证文件信息?忽略任何错误都是不对的?如果第一列的数字大于22500,则整行都是错误的
它现在所做的,这是错误的:
我希望它做什么,这是正确的:
文件中的每条记录长度为1024个字符。我认为解决方案应该与*一致,因为这里我从流中读取字节,索引是数组中的起点。字节[],索引,计数
通常,这些文件看起来像这样,并且都具有相同的结构:(包含682条记录的大文件)
由于您没有提供所处理数据的任何描述,因此很难找到比这更好的方法:
while ((length = Br.Read(rec_arr, (int)0, 1024)) > 0) *
{
// Read other info here
var foo = DecodeLong(rec_arr, 4);
if (foo != 825045041)
Dgv.Rows.Add(foo, count++, DecodeDateTime(rec_arr, 28));
}
在To_Fields
方法中,您可以跳过一条记录:
int rec_num_to_read = Dgv.CurrentRow.Index + 1;
然而,我试图用截图中的数据运行代码,但没有成功。我跳过了1024个字节(不需要的记录),从下一条记录的开头得到的内容似乎也无效。值是542966816,日期很乱。我不知道日期的格式,但很明显是出了什么问题 我没有足够的声誉来发布图片,所以这里有一个链接:
我想补充一点,有几种说法是无用的 您不需要调用
Close()
,这就是使用的目的
如果没有您遗漏的代码,则其他备注是正确的
读取是在循环中完成的,因此不需要ReadAllBytes
rec_arr = File.ReadAllBytes(import.FileName);
长度
也不使用
FileInfo fi = new FileInfo(import.FileName);
long length = fi.Length;
还有一件事,long
是C#中的64位。使用32位的int
。因此,最好将DecodeLong
重命名为DecodeInt32
,因为这真的很让人困惑。您是否尝试过调试并查看不需要的数据的来源和原因?当您在同一个文件上运行代码时,结果是不同的?您可以将完整代码发布到Dgv填充的位置吗?我们对您的数据了解不够,无法帮助您进行验证。这两个可疑行的日期也可以追溯到20世纪90年代。我尝试了您的解决方案,尽管它正确地显示了正确数量的记录,但功能仍然相同。当我选择第一条记录为1时,它表示字段中的数字是825041。。。选择记录2表示字段中的数字为1。这有点难以解释,但已经解释了一半。我在使用的.bin文件中包含了一个数据截图,希望能有所帮助。第二行应该是什么值和日期?我在to_Fields方法中添加了这一行,这很简单但很天才!我不知道为什么我从没想过,哦,不!谢谢!:)不客气!但这不是一般的解决办法。如果文件中间有一个无效的记录,所有的问题都会出错。虽然它解决了第一行的问题,但是当相同的值有时只出现在最后一个记录中时呢?基本上,如果最后一个'foo'等于825041,则不添加该行。这种情况并非总是发生,但有时会发生:/