使用StringBuilder </string>将List <string>转换为csv

时间:2014-09-07 00:06:29

标签: c# if-statement foreach

我有一个用文本文件生成的列表。我正在浏览列表并使用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。

enter image description here

如果你看到链接,在它之前有一个^,当它到达时,它应该移动到第2行,然后当它再次点击^到第3行,依此类推。当它击中^

时,它是一个新记录

这应该是它的样子......

What I am trying to get it to look like

修改/更新

Physician Name, (CPSO#)
Primary Practice Location
Disciplinary Info  &amp; 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

4 个答案:

答案 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);