我有一个控制台应用程序,可将结果输出到.csv文件中。控制台应用程序调用多个Web服务并输出多个数据。输出包含区分一个站点与另一个站点的URL。代码工作正常,但输出在一个大的CSV文件中,当它到达标题时它会被分割,然后开始从新站点写入数据。
现在,您可以了解CSV文件中的输出结果:
ProjectTitle,PublishStatus,Type,NumberOfUsers, URL
Project one,published,Open,1,http://localhost/test1
Project two,expired,Closed,14,http://localhost/test1
ProjectTitle,PublishStatus,Type,NumberOfUsers,URL
Project one V2,expired,Closed,2,http://localhost/test2
Project two V2,Published,Open,3,http://localhost/test2
我想要做的是输出第一组数据(取决于每个URL),然后输出Excel中不同选项卡中的第二组数据,或者只是为新数据集创建一个新文件。我的代码:
public static XmlDocument xml = new XmlDocument();
static void Main(string[] args)
{
xml.Load("config.xml");
test();
}
private static void test()
{
List<string> url = new List<string>();
int count = xml.GetElementsByTagName("url").Count;
for (int i = 0; i < count; ++i)
{
url.Add(xml.GetElementsByTagName("url")[i].InnerText);
Url = url[i];
}
string listFile = "ListOfSites";
string outCsvFile = string.Format(@"C:\\testFile\\{0}.csv", testFile + DateTime.Now.ToString("_yyyyMMdd HHmms"));
using (FileStream fs = new FileStream(outCsvFile, FileMode.Append, FileAccess.Write))
using (StreamWriter file = new StreamWriter(fs))
file.WriteLine("ProjectTitle,PublishStatus,Type,NumberOfSUsers,URL");
foreach(WS.ProjectData proj in pr.Distinct(new ProjectEqualityComparer()))
{
file.WriteLine("{0},\"{1}\",{2},{3},{4}",
proj.ProjectTitle,
proj.PublishStatus,
proj.type,
proj.userIDs.Length.ToString(NumberFormatInfo.InvariantInfo),
url[i].ToString());
}
}
答案 0 :(得分:1)
这是一个快速修复。可能还有一种更优雅的方式来实现这一目标:
public static XmlDocument xml = new XmlDocument();
static void Main(string[] args)
{
xml.Load("config.xml");
// relocated from `test` method to `Main`
List<string> url = new List<string>();
int count = xml.GetElementsByTagName("url").Count;
for (int i = 0; i < count; ++i)
{
url.Add(xml.GetElementsByTagName("url")[i].InnerText);
Url = url[i];
test(Url);
}
}
private static void test(string url)
{
string listFile = "ListOfSites";
string outCsvFile = string.Format(@"C:\\testFile\\{0}.csv", testFile + DateTime.Now.ToString("_yyyyMMdd HHmms"));
using (FileStream fs = new FileStream(outCsvFile, FileMode.Append, FileAccess.Write))
{
using (StreamWriter file = new StreamWriter(fs))
{
file.WriteLine("ProjectTitle,PublishStatus,Type,NumberOfSUsers,URL");
foreach(WS.ProjectData proj in pr.Distinct(new ProjectEqualityComparer()))
{
file.WriteLine("{0},\"{1}\",{2},{3},{4}",
proj.ProjectTitle,
proj.PublishStatus,
proj.type,
proj.userIDs.Length.ToString(NumberFormatInfo.InvariantInfo),
url);
}
}
}
}
注意:即使您不需要,也请在C#中使用大括号。它使您的代码更具可读性。
答案 1 :(得分:1)
如果您想编写带有不同工作表的Excel文件,您可以尝试使用EpPlus库,它是开源的,免费的。
要生成更多文件,您必须决定如何命名它们,如果每个文件的记录在源列表中是随机的,您可以为不同的输出文件生成不同的输出字符串列表并使用File.AppendAllLines(filename ,收藏);将数据保存在不同的文件中。我不建议您打开和关闭要写入的每一行的文件,因为这是耗费时间和资源的操作。