我正在尝试从csv读取两列,行由';'分隔。
我正在使用stram.ReadLine
方法,但问题是某些单元格的文本具有换行符号,因此,方法ReadLine
将该单元格分解为其他几个单元格,如何避免这个 ?为了简化这个模型,假设我有一列有100行,但有些列内部有长文本和一些断行,如何将其修改为100行而不是更多?
StreamReader aFile = new StreamReader("C:\\dev\\csvReplacment\\szablonDE.csv");
var dane = new List<string>();
string line;
while ((line = aFile.ReadLine()) != null)
{
dane.Add(line);
}
aFile.Close();
答案 0 :(得分:1)
假设;
标记了一行的结尾:
// Build your final resulting list
List<String> dane = new List<String>();
// use StreamReader to read the file
using (StreamReader sr = new StreamReader(ms))
{
// create a string builder that we can use to store each
// line's contents until it's ready to be added to dane
StringBuilder builder = new StringBuilder();
// buffer char
Char c;
// read the stream character by character
while (!sr.EndOfStream)
{
c = (Char)sr.Read();
// if it's `;` it's the end of a row, so add it to
// dane and reset the line's contents
if (c == ';')
{
dane.Add(builder.ToString());
builder.Clear();
}
// avoid reading in superfluous whitespace before we
// begin reading a line
else if (builder.Length == 0 && Char.IsWhiteSpace(c))
{
continue;
}
// concatenate the current character to our line
else
{
builder.Append(c);
}
}
// if there's a final row, add it to dane
if (builder.Length > 0)
{
dane.Add(builder.ToString());
}
}
// dane now contains each line's contents.
您可以对此进行优化并一次读取1024个字符并在其中搜索;
,但这只是一个向您展示如何开始的原始示例。
答案 1 :(得分:1)
使用Nuget的现有CSV解析器。 &#34; CSVTools&#34;在Nuget(http://www.nuget.org/packages/CsvTools/)上处理这个并且非常快,支持绑定到强大的.NET类型以便于解析。
http://blogs.msdn.com/b/jmstall/archive/2012/03/24/opensource-csv-reader-on-nuget.aspx
用法是这样的:
var dt = DataAccess.DataTable.New.Read(@"c:\temp\test.csv");
foreach (Row row in dt.Rows()) { }
答案 2 :(得分:0)
我建议您只使用一些现有的代码/ lib,而不是将其自己挤在一起
http://csvfile.codeplex.com/ http://www.codeproject.com/Articles/12170/FileHelpers-v2-0-Delimited-CSV-or-Fixed-Data-Impor
那里只有2个
我还建议使用ServiceStack.Text nuget https://www.nuget.org/packages/ServiceStack.Text/3.9.64