我正在使用快速CSV阅读器将一些粘贴的文本解析为网页.Fast CSV阅读器需要一个TextReader对象,而我所拥有的只是一个字符串.在运行中将字符串转换为TextReader对象的最佳方法是什么?
谢谢!
更新 - 示例代码 - 在原始示例中,新的StreamReader正在查找名为"data.csv"的文件.我希望通过TextBox_StartData.Text提供它.
使用下面的代码不会编译.
TextReader sr = new StringReader(TextBox_StartData.Text);
using (CsvReader csv = new CsvReader(new StreamReader(sr), true))
{
DetailsView1.DataSource = csv;
DetailsView1.DataBind();
}
Run Code Online (Sandbox Code Playgroud)
该new StreamReader(sr)告诉我它有一些无效的参数.有任何想法吗?
作为替代方法,我试过这个:
TextReader sr = new StreamReader(TextBox_StartData.Text);
using (CsvReader csv = new CsvReader(sr, true))
{
DetailsView1.DataSource = csv;
DetailsView1.DataBind();
}
Run Code Online (Sandbox Code Playgroud)
但我得到一个Illegal characters in path Error.这里是TextBox_StartData.Text中的字符串示例:
Fname\tLname\tEmail\nClaude\tCuriel\tClaude.Curiel@email.com\nAntoinette\tCalixte\tAntoinette.Calixte@email.com\nCathey\tPeden\tCathey.Peden@email.com\n
Run Code Online (Sandbox Code Playgroud)
如果这是正确的方法,任何想法?再次感谢你的帮助!
这是我的代码:
public static TextWriter twLog = null;
private int fileNo = 1;
private string line = null;
TextReader tr = new StreamReader("file_no.txt");
TextWriter tw = new StreamWriter("file_no.txt");
line = tr.ReadLine();
if(line != null){
fileNo = int.Parse(line);
twLog = new StreamWriter("log_" + line + ".txt");
}else{
twLog = new StreamWriter("log_" + fileNo.toString() + ".txt");
}
System.IO.File.WriteAllText("file_no.txt",string.Empty);
tw.WriteLine((fileNo++).ToString());
tr.Close();
tw.Close();
twLog.Close();
Run Code Online (Sandbox Code Playgroud)
它抛出此错误:
IOException:路径C:\ Users\Water Simulation\file_no.txt上的共享冲突
我要做的只是打开一个带有log_x.txt名称的文件,并从file_no.txt文件中取出"x".如果file_no.txt文件为空,请将日志文件的名称设为log_1.txt并写入"fileNo + 1" to file_no.txt.新程序启动后,新的日志文件名必须是log_2.txt.But我收到此错误,我无法理解我做错了什么.谢谢你的帮助.
如何从TextReader 循环遍历行source?
我试过了
foreach (var line in source)
Run Code Online (Sandbox Code Playgroud)
但得到了错误
foreach语句不能对'System.IO.TextReader'类型的变量进行操作,因为'System.IO.TextReader'不包含'GetEnumerator'的公共定义
我很好奇为什么以下内容在"最后"赋值时抛出错误消息(文本阅读器关闭异常):
IEnumerable<string> textRows = File.ReadLines(sourceTextFileName);
IEnumerator<string> textEnumerator = textRows.GetEnumerator();
string first = textRows.First();
string last = textRows.Last();
Run Code Online (Sandbox Code Playgroud)
但是以下执行正常:
IEnumerable<string> textRows = File.ReadLines(sourceTextFileName);
string first = textRows.First();
string last = textRows.Last();
IEnumerator<string> textEnumerator = textRows.GetEnumerator();
Run Code Online (Sandbox Code Playgroud)
不同行为的原因是什么?
当我使用文本阅读器时,检测到我实际上在数据末尾的最佳方法是什么?通常的方法做,这是什么样的下面,
while(reader.Peek() != -1)
{
///do stuff
}
Run Code Online (Sandbox Code Playgroud)
但是这里的msdn文档说明如下
表示要读取的下一个字符的整数,如果没有更多字符可用或读者不支持搜索,则返回-1.
所以我的问题是你怎么知道你是否真的在读者数据的末尾,或者读者/底层流不支持寻求,因为这里的返回值似乎含糊不清?如果我有以下内容
public void Parse(TextReader reader)
{
while(reader.Peek() != -1) //am I really at the end
{
//do stuff
}
}
Parse(new StreamReader(new NetworkStream(....)));
Run Code Online (Sandbox Code Playgroud)
因为网络流不支持寻求.
还是我错过了什么?
编辑:
为了澄清,我可以使用更具体的StreamReader类轻松实现这一点,因为我可以检查EoS.但是为了保持一般性,我想使用TextReader,所以我不仅仅与StreamReader绑定.然而,Peek的语义似乎有点奇怪,为什么它不仅仅是在寻求不支持的情况下抛出,为此为什么没有TextReader的EoF属性?
给定一个XDocument实例,如何轻松获取表示该实例的TextReader?
我能想出的最好的东西是这样的(xmlXDocument实例在哪里):
var s = new MemoryStream();
var sw = new StreamWriter(s);
xml.Save(sw);
sw.Flush();
s.Position = 0;
TextReader tr = new StreamReader(s);
Run Code Online (Sandbox Code Playgroud)
然而,这似乎有点笨重,所以我想知道是否有更简单的方法?
编辑
上面的示例等效于将整个实例转换为XML字符串,然后在该字符串上创建TextReader.
我只是想知道是否有一种类似于流的方式来执行它而不是将整个内容读入内存.
我有3个TextReaders - StreamReaders和StringReaders的组合.从概念上讲,它们的串联是单个文本文档.
我想调用一个带有单个TextReader的方法(不在我的控制之下).是否有任何内置或简单的方法可以从多个TextReader中连接TextReader?
(我可以编写自己的TextReader子类,但看起来工作量相当大.在这种情况下,我只需将它们全部写入临时文件,然后使用单个StreamReader打开它.)
有一个简单的解决方案,我错过了吗?
因此 TextReader.ReadLine() 返回一个字符串,但 TextReader.Read() 返回一个 int 值。这个 int 值似乎也是某种我无法识别的格式。是否可以将这个整数转换为字符?谢谢你的帮助。
编辑:
TextReader 值 = new StreamReader(@"txt");
string SValue1;
int Value1;
Value1 = Values.Read();
Console.WriteLine(Value1);
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)
当它读出值时,它给出 51 作为输出。txt文件中的第一个字符是3。为什么会这样做呢?
如何打开一个StreamReader用FILE_SHARE_READ,FILE_SHARE_WRITE,FILE_SHARE_DELETE?
我如何打开一个StreamReader以便我可以读取编码的文本文件,共享选项,以便另一个进程可以读取该文件?
我如何打开一个StreamReader以便我可以读取编码的文本文件,使用共享选项,以便其他进程可以在我阅读时修改该文件?
我如何打开一个StreamReader以便我可以读取编码的文本文件,使用共享选项,以便其他进程可以在我阅读时删除该文件?
在.NET Framework类库中有一个名为的类StreamReader.它是唯一一个用于读取"text"的类,这就是它从抽象基TextReader类中下降的原因.在TextReader/StreamReader允许您指定由您试图打开该文件使用的编码,并可以为您的文件进行解码,并返回Strings文本.
一旦我打开了一个文件StreamReader:
var sr = new StreamReader(path);
Run Code Online (Sandbox Code Playgroud)
文件被锁定,其他进程无法修改或删除该文件.我需要的是相当于一个FileStream类的FileShare枚举:
除此之外,由于显而易见的原因,我不能使用FileStream- 必须使用a StreamReader.
我怎样才能打开一个StreamReader用FileShare.ReadWrite | FileShare.Delete?
标题或多或少都说明了一切.电话记录:
这里 for TextReader.Read Method (Char[], Int32, Int32)
和
Here用于TextReader.ReadBlock()相同的参数类型.
我想提取一个字节数组的一部分,为此我构成一个MemoryStream我打算用StreamReader这样的方式读取:
StreamReader r = new StreamReader(new MemoryStream(rawData, 0, 184, false, false));
r.Read.....
Run Code Online (Sandbox Code Playgroud)
我应该使用哪一个?其中一个更快还是更好?
textreader ×10
c# ×9
.net ×3
streamreader ×3
char ×1
csv ×1
csvhelper ×1
file-io ×1
fileshare ×1
ienumerable ×1
ienumerator ×1
input ×1
int32 ×1
linq-to-xml ×1
sharing ×1
stream ×1
stringreader ×1
textwriter ×1