0

我有一个像数据模型这样的表:

fieldA (10 chracters UTF-8)

fieldB(12 characters UTF-8)

fieldC (11 characters UTF-8)

每个字段都是固定长度并写入一个文件(磁盘上的本地文件),没有任何 UTF-8 编码的分隔符(使用 StreamWriter 编写)。生成的文件如下所示:

fieldAfieldBfieldCfieldAfieldBfieldC [...]

我也知道记录的数量,可以使用 BaseStream.Seek() 随机访问文件。

比方说,我想读取第 29 条记录并填充我的数据模型,什么是有效(快速)的方法?我可以使用 StreamReader 并读取单个字符,但由于 UTF-8,这不是问题吗?我不想在我的数据中添加逗号并使用字符串拆分方法——我希望在 C# 中有更好的方法。

这不是用于生产用途,欢迎进行疯狂和微优化:)

谢谢你的帮助!

4

3 回答 3

0

您可以查找文件中的适当位置,然后使用FileStream.Read()读取适当数量的 UTF8 字符,然后通过以下方式将其转换为 C# 字符串:

string s = Encoding.UTF8.GetString(buffer, 0, buffer.Length);

或者您可以使用以正确编码打开的 StreamReader,然后使用StreamReader.Read(char[] buffer, int index, int count)读取正确数量的字符(在寻找正确的位置后)。

正如您在 OP 中所说,这只有在您确实可以找到正确的地方时才有效!

阅读有关可变长度 UTF8 编码字符的评论!

于 2013-05-23T11:21:35.060 回答
0

因为 utf8 是一种可变宽度编码(即它使用可变数量的字节来表示不同的字符),所以您别无选择,只能从头开始扫描。

如果要计算并跳转到偏移量,则需要使用固定大小的编码,即 UTF-32

于 2013-05-23T11:25:49.160 回答
0

每个字段都是固定长度并写入一个文件(磁盘上的本地文件),没有任何 UTF-8 编码的分隔符(使用 StreamWriter 编写)。

你说你的字段是固定长度的。这意味着文件中的 fieldA 始终为 10 字节(无论实际内容如何),fieldB 始终为 12 字节,fieldC 始终为 11 字节。

由于上述原因,文本是 UTF-8 的事实与问题无关。

如果您打开 System.IO.Stream,您可以查看不想读取的每个字段的字节。例如,如果你想读取 fieldC,那么你可以向前搜索 22 个字节(跳过 fieldA 和 fieldB):

stream.Seek(22, SeekOrigin.Current);

到达正确位置后,您可以读取固定数量的字节,然后通过 UTF-8 将这些字节解码为生成的字符串。

于 2013-05-23T11:36:01.483 回答