我有一个用文本文件生成的列表。我正在浏览列表并使用StringBuilder,因此我可以使用StringBuilder对象来创建csv文件。当文件在新记录上开始时,该文件具有^。当List返回一个包含^的字符串时,我需要能够向stringbuilder对象添加一个新行,但正如您在下面的代码中看到的那样,我永远无法告诉我何时添加新行并且我不知道我不知道如何解决它。
以下是我尝试过的方法之一,问题显示在
中foreach (var a in lstData)
{
if (a.Contains("^"))
{
string strName = Regex.Replace(a, "<.*?>", string.Empty).Remove(0, 1);
sbQ.Append(strName + ",");
}
else
{
sbQ.Append(a + ",");
}
if (a.Contains("^")) sbQ.AppendLine();
// Doesn't work, always appendlines when it encounters '^'
// should only append new line on next occurence
}
,这是另一种方式。
string strZ;
string strX;
foreach (var a in lstData)
{
if (a.Contains("^"))
{
strZ = Regex.Replace(a, "<.*?>", string.Empty).Remove(0, 1);
sbQ.Append(strZ + ",");
strX = strZ;
}
if (strZ == strX)
{
// Causes Error : Use of Unassigned local variable 'strX'
}
}
我尝试通过迭代List的副本来使用do / while语句,但也没有用。
修改
文本文件中的数据如下所示..
^<a class= ........>Name</a>
value1
value2
value3
value4
etc....
^<a class=......>Name</a>
value1
value2
value3
value4
etc....
^<a class=......>Name</a>
etc...
我想要完成的事情
name, value1, value2, value3, value4, etc...
name, value1, value2, value3, value4, etc...
修改 结果在csv。
如果你看到链接,在它之前有一个^,当它到达时,它应该移动到第2行,然后当它再次点击^到第3行,依此类推。当它击中^
时,它是一个新记录这应该是它的样子......
修改/更新
Physician Name, (CPSO#)
Primary Practice Location
Disciplinary Info & Restrictions
^Aal Ali, Saleh Saif Salem A S Fares (#82358)
P O Box: 8313
Abu Dhabi 0000
United Arab Emirates
Phone: +971506117644
^Aalders, Ryan Francis (#103559)
Kingston General Hospital
Department of Family Medicine
76 Stuart Street
Kingston ON K7L 2V7
Phone: (613) 533-9300
^Aarabi, Mehdi (#81281)
UHN Toronto Western Hospital
2nd Floor East Wing
399 Bathurst Street
Toronto ON M5T 2S8
Phone: (416) 603-5641
^Aaron, Shawn David (#62311)
Ottawa General Hospital
501 Smyth Road
Ottawa ON K1H 8L6
Phone: (613) 737-8899 Ext. 74729
Fax: (613) 739-6807
答案 0 :(得分:2)
作为替代方案,您可以使用LINQ来构建列表。请参阅以下内容: Make CSV from list of string in LINQ
答案 1 :(得分:1)
你可以制作一个帮助方法,在它碰到胡萝卜时添加换行符。 File.ReadLine将在换行符中断,然后我们可以在helper方法中替换胡萝卜并执行您想要的数据清理。然后使用String.Join将所有结果与逗号结合起来。
private static void Main(string[] args)
{
var text = File.ReadLines(@"YourFile.txt");
var lines = ParseList(text);
using (var file = File.AppendText(@"NewFile.csv"))
{
file.Write(String.Join(",", lines));
}
Console.ReadLine();
}
private static IEnumerable<string> ParseList(IEnumerable<string> lines)
{
foreach (var line in lines)
{
var newline = Regex.Replace(line, @"<.*?>", String.Empty);
if (newline.StartsWith("^"))
{
// change carrot to newline
newline = Environment.NewLine + newline.Remove(0, 1);
}
yield return newline;
}
}
答案 2 :(得分:0)
这似乎有效:
List<string> list =
new List<string>{"^one","two","^three","four","f1","f2","^five","six","s1","s2"};
StringBuilder sb = new StringBuilder();
foreach (var element in list)
{
if (element.Contains("^")) {
sb.Append("\r\n" + element.Replace("^",""));
}
else {
sb.Append("," + element);
}
}
var result = sb.ToString();
输出:
一个,两个
三,四,F1,F2
五个,六个,S1,S2
您可能希望在那里进行html解析
答案 3 :(得分:0)
此代码有效,并且将处理^出现在数据中(除了作为行的第一个字符)
var text = File.ReadAllText("filename.txt");
using(var file = File.AppendText("NewFile.txt"))
foreach (var csv in text.Split(new []{Environment.NewLine+"^", "\n^"}, StringSplitOptions.None)
.Select(line => line.Split(new []{Environment.NewLine, "\n"}, StringSplitOptions.None))
.Select(sublines => string.Join(",", sublines.Select(s => s.ToString()))))
{
file.WriteLine(csv);
}
看到这个小提琴:
https://dotnetfiddle.net/uyHppL
而且,这是一个不使用foreach的变体,它应该更有效率,因为它只会写入文件一次。
var csv = string.Join(Environment.NewLine, text.Split(new []{Environment.NewLine+"^", "\n^"}, StringSplitOptions.None)
.Select(line => line.Split(new []{Environment.NewLine, "\n"}, StringSplitOptions.None))
.Select(sublines => string.Join(",", sublines.Select(s => s.ToString()))));
using(var file = File.AppendText("NewFile.txt"))
file.WriteLine(csv);