使用C#创建和写入CSV文件时遇到的问题

3
我正在使用Ranorex 5.4.2中的C#代码创建CSV文件,从XML文件中获取数据,然后将其写入CSV文件。我已经成功实现了这个过程,但是我遇到了一个问题,即在收集的数据下面创建了12行空白行。
我有一个名为CreateCSVFile的文件,用于创建CSV文件并添加标题,代码如下:
writer.WriteLine("PolicyNumber,Surname,Postcode,HouseNumber,StreetName,CityName,CountyName,VehicleRegistrationPlate,VehicleMake,VehicleModel,VehicleType,DateRegistered,ABICode");
        writer.WriteLine("");
        writer.Flush();
        writer.Close();

下一个要运行的是MineDataFromOutputXML。我自动化的程序提供保险报价,并创建包含客户详细信息的输出xml文件。我已经设置了一个挖掘过程,其中在顶部声明了一个变量,显示为:
string _PolicyHolderSurname = "";
    [TestVariable("3E92E370-F960-477B-853A-0F61BEA62B7B")]
    public string PolicyHolderSurname
    {
        get { return _PolicyHolderSurname; }
        set { _PolicyHolderSurname = value; }
    }

然后还有另一个代码部分是从XML文件中收集信息的:

var QuotePolicyHolderSurname = (XmlElement)xmlDoc.SelectSingleNode("//cipSurname");
        string QuotePolicyHolderSurnameAsString = QuotePolicyHolderSurname.InnerText.ToString();
        PolicyHolderSurname = QuotePolicyHolderSurnameAsString;
        Report.Info( "Policy Holder Surname As String = " + QuotePolicyHolderSurnameAsString);
        Report.Info( "Quote Policy Holder Surname = " + QuotePolicyHolderSurname.InnerText);

最终的文件名为SetDataSource,并将信息放入CSV文件中,顶部声明了一个变量,如下所示:
string _PolicyHolderSurname = "";
    [TestVariable("222D47D2-6F66-4F05-BDAF-7D3B9D335647")]
    public string PolicyHolderSurname
    {
        get { return _PolicyHolderSurname; }
        set { _PolicyHolderSurname = value; }
    }

这是将其添加到CSV文件中的代码:
string Surname = PolicyHolderSurname;
        Report.Info("Surname = " + Surname);
        dataConn.Rows.Add(new string[] { Surname });
        dataConn.Store();

在Mine和SetDataSource文件中有多个项目,Notepad++中的输出如下所示:图片展示了代码运行后的CSV文件。我认为问题在于CreateCSVFile和writer.WriteLine函数。我已将此区域注释掉,但它只会生成仅显示标题的CSV文件。我询问了一些与我合作的开发人员,但大多数人不太熟悉C#,而且还没有人能够解决这个问题。如果这很重要,那么它是在Windows Server 2012r2上运行的。如果有任何问题,请问,我可以提供整个文件,但它们非常冗长而且重复。谢谢!Ben Jardine

你实际上在插入表头后写入CSV文件的哪个位置? - Vishnu Prasad V
我建议您研究一下 LinqToCSV,它可以轻松创建和使用 CSV 文件:https://www.nuget.org/packages/LinqToCsv/ - Stephen Brickner
在上面的代码片段中,“dataConn”是在Ranorex测试套件中创建的Ranorex数据连接器吗?我会看一下它是如何定义的。依我之见,使用IO.File.AppendText写入文件比使用Ranorex数据连接器更简单。如果需要的话,可以通过运行TestCase.Current.DataContext.ReloadData()重新加载测试数据。 - Sup3rHugh
1个回答

2

我在Ranorex中也有同样的任务要完成。由于这个问题有点老,我没有检查你的代码,但是这是我所做的,并且已经起作用了。我找到了一个例子(可能在堆栈上)用C#创建CSV文件,因此这是我为在Ranorex UserCodeCollection中使用进行适应的。

[UserCodeCollection]
    public class UserCodeCollectionDemo
    {

        [UserCodeMethod]
        public static void ConvertXmlToCsv()
        {
            System.IO.File.Delete("E:\\Ranorex_test.csv");
            XDocument doc = XDocument.Load("E:\\lang.xml");
            string csvOut = string.Empty;
            StringBuilder sColumnString = new StringBuilder(50000);
            StringBuilder sDataString = new StringBuilder(50000);
            foreach (XElement node in doc.Descendants(GetServerLanguage()))
            {
                foreach (XElement categoryNode in node.Elements())
                {
                    foreach (XElement innerNode in categoryNode.Elements())
                    {
                        //"{0}," give you the output in Comma seperated format.
                        string sNodePath = categoryNode.Name + "_" + innerNode.Name;
                        sColumnString.AppendFormat("{0},", sNodePath);
                        sDataString.AppendFormat("{0},", innerNode.Value);
                    }
                }
            }
            if ((sColumnString.Length > 1) && (sDataString.Length > 1))
            {
                sColumnString.Remove(sColumnString.Length-1, 1);
                sDataString.Remove(sDataString.Length-1, 1);
            }
            string[] lines = { sColumnString.ToString(), sDataString.ToString() };
            System.IO.File.WriteAllLines(@"E:\Ranorex_test.csv", lines);
        }
}

提供信息,我的xml文件的简单版本如下:

<LANGUAGE>
    <ENGLISH ID="1033">
        <TEXT>
            <IDS_TEXT_CANCEL>Cancel</IDS_TEXT_CANCEL>
            <IDS_TEXT_WARNING>Warning</IDS_TEXT_WARNING>
        </TEXT> 
        <LOGINCLASS>
            <IDS_LOGC_DLGTITLE>Log In</IDS_LOGC_DLGTITLE>
        </LOGINCLASS>
    </ENGLISH>
    <FRENCH ID="1036">
        <TEXT>
            <IDS_TEXT_CANCEL>Annuler</IDS_TEXT_CANCEL>
            <IDS_TEXT_WARNING>Attention</IDS_TEXT_WARNING>
        </TEXT> 
        <LOGINCLASS>
            <IDS_LOGC_DLGTITLE>Connexion</IDS_LOGC_DLGTITLE>
        </LOGINCLASS>
    </FRENCH>
</LANGUAGE>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接