- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个文本文件,其中包含我要解析的固定长度表。但是,文件的开头是有关何时生成此表的一般信息(IE 时间、数据等)。
为了阅读这个文件,我尝试创建一个 FileStream
,然后使用 StreamReader
读取该文件的第一部分。我从文档的顶部解析出我需要的内容,然后在完成后将流的位置设置为结构化数据的第一行。
然后我将 TextFieldParser
附加到流(对固定长度表进行适当设置),然后尝试读取文件。在第一行,它失败了,在 ErrorLine
属性中,它列出了表格第三行的后半部分。我逐步浏览了它,它位于第一行以供阅读,但 ErrorLine
属性表明情况并非如此。
调试时,我发现如果在将 TextFieldParser
附加到流后尝试使用 StreamReader.ReadLine()
方法,前 2 行会显示美好的。然而,当我读取第三行时,它返回一行,它从第三行的前半部分开始(并在 ErrorLine
中的文本所在的位置停止)追加一些后面的部分文档。如果我在附加 TextFieldParser
之前尝试这样做,它会读取所有 3 行。
我觉得这与我将 2 个读者绑定(bind)到同一个流有关。我不确定如何用结构化部分和非结构化部分来阅读这篇文章,而不仅仅是自己标记这些行。我可以这样做,但我想我不是第一个想要以一种方式读取流的一部分,而以另一种方式读取流的后续部分的人。
为什么会这样跳,如何读取不同格式的文本文件?
例子:
Date: 3/1/2013
Time: 3:00 PM
Sensor: Awesome Thing
Seconds X Y Value
0 5.1 2.8 55
30 4.9 2.5 33
60 5.0 5.3 44
为这个简化示例量身定制的代码:
Boolean setupInfo = true;
DataTable result = new DataTable();
String[] fields;
Double[] dFields;
FileStream stream = File.Open(filePath,FileMode.Open);
StreamReader reader = new StreamReader(stream);
String tempLine;
for(int j = 1; j <= 7; j++)
{
result.Columns.Add(("Column" + j));
}
//Parse the unstructured part
while(setupInfo)
{
tempLine = reader.ReadLine();
if( tempLine.StartsWith("Date: "))
{
result.Rows.Add(tempLine);
}
else if (tempLine.StartsWith("Time: "))
{
result.Rows.Add(tempLine);
}
else if (tempLine.StartsWith("Seconds")
{
//break out of this loop because the
//next line to be read is the unstructured part
setupInfo = false;
}
}
//Parse the structured part
TextFieldParser parser = new TextFieldParser(stream);
parser.TextFieldType = FieldType.FixedWidth;
parser.HasFieldsEnclosedInQuotes = false;
parser.SetFieldWidths(10, 10, 10, 10);
while (!parser.EndOfData)
{
if (reader.Peek() == '*')
{
break;
}
else
{
fields = parser.ReadFields();
if (parseStrings(fields, out dFields))
{
result.Rows.Add(dFields);
}
}
}
return result;
最佳答案
它跳过的原因是 StreamReader
正在从 FileStream
中读取数据 block ,而不是逐个字符地读取。例如,StreamReader
可能会从 FileStream
中读取 4 KB,然后根据需要解析出响应 ReadLine()
调用的行。因此,当您将 TextFieldParser
附加到 FileStream
时,它将从当前文件位置读取 - 这是 StreamReader
离开它的位置。
解决方案应该非常简单:只需将 TextFieldParser
连接到 StreamReader
:
TextFieldParser parser = new TextFieldParser(reader);
关于c# - 具有 2 个不同读者的阅读流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168158/
我无法理解为什么第一个读者-作者问题会导致写进程饿死,即:代码如何为读者进程提供优先级?当其中一个读取进程执行 signal(wrt) 时,写入进程是否应该无法获得锁定?是信号量列表的结构(正如我所看
我正在使用R处理人口普查数据,该数据使用了很长的数字GEOID来标识地理位置。我面临的问题是,当使用write_csv(来自readr包)写出处理后的数据时,正在以科学计数法编写这些GEOID。有办法
我为 Java 中的读写器问题开发了一个解决方案(有关此的一些信息 http://lass.cs.umass.edu/~shenoy/courses/fall08/lectures/Lec11.pdf
以下代码是Java中的Passing the Baton程序的一部分: 主要 P1(作家) P2(作家) P3(阅读器) P4(阅读器) 主要(); package ReadersPreference
我正在使用 ReaderWriterLockSlim保护一些操作。我想偏爱读者而不是作者,这样当读者长时间持有锁并且作者试图获取写锁时,进一步的读者不会被作者的尝试阻塞(如果作者在 lock.Ente
我觉得这可能是一种非常普遍和常见的情况,存在众所周知的无锁解决方案。 简而言之,我希望有像读者/作者锁这样的方法,但这不需要读者获取锁,因此可以获得更好的平均性能。 相反,读者需要一些原子操作(128
我遇到了读者-作者问题。我想写出作家喜欢使用互斥锁的解决方案。到目前为止我已经写了这个 #include #include #include #include #include #inclu
这个程序读取“电子邮件”(实际上只是一个像电子邮件一样结构的 .txt 文件)并用它做各种事情(在 map 中存储数据并对其进行操作)。 但是,我在根据主题搜索输出电子邮件的“消息”时遇到了一个不寻常
我正在从 UIWebView 切换到 WKWebView,不知道如何设置我的配置以使用 Reader. 有没有人可以帮助我? viewDidLoad: WKWebViewConfiguration *
我正在练习 Visual Basic 编程我在 Visual Basic 中有两种形式。第一个表单有一个命令按钮,将显示第二个表单的输入数据第二种形式有一个文本框,我需要在其中输入数据并保存它。 我在
我想寻求有关此任务的帮助。 我的任务是用 C 编写一个简单的程序来模拟读写器问题。程序要求是: 程序启动后,会要求用户输入作者和读者的输入次数。 程序会不断通知用户线程的状态。 程序结束后,小统计(每
我有一个用 C 语言模拟读者-作者问题的简单程序。要求用户输入作者数和读者数。然后创建随机数的编写器 - 线程和读取器 - 线程。项目的写入由全局变量 itemsCount 模拟 - 它代表新插入项目
我有一个“静态 64 位整数变量”,它仅由一个线程更新。所有其他线程仅从中读取。 出于安全原因,我是否应该使用原子操作(例如“__sync_add_and_fetch”)来保护这个变量? 还是可以直接
我是一名优秀的程序员,十分优秀!