繁体   English   中英

使用 CSVhelper 将单个列更新为以前编写的 CSV 文件。 我有 Java 代码,但无法将其翻译成 C#

[英]Using CSVhelper to update a single column into a previously written CSV file . I have the code in Java but can't translate it into C#

我一直在尝试使用CSVhelper更新 CSV 文件。 我的代码是用 Java 编写的,当我尝试用 C# 翻译相同的代码时,它不起作用。

本质上,我必须在测试完成执行后使用当前日期读取和更新 CSVfile(只有一列)(在测试执行开始时写入了一些值)。 我也有一个 DateTime 错误,无论我尝试什么都没有得到解决。

这是Java中的代码

public synchronized void writeEndCSV(String runId) 
    {
        CSVWriter csvWriter = null;
        try
        {
            String setupCSVLocation = Reporting.getSetupCSVLocation();
            CSVReader csvReader =  new CSVReader(new FileReader(setupCSVLocation));
            List<String[]> records = csvReader.readAll();
            for(int i=0;i<records.size();i++)
            {
                if(records.get(i)[SETUP_RUNID].equalsIgnoreCase(runId));
                {
                    records.get(i)[SETUP_TimeTakenByLocatorJSON] = Reporting.getExecutionEndDate();
                   
                }
            }
 
            csvReader.close();
            csvWriter = new CSVWriter(new FileWriter(setupCSVLocation));
            csvWriter.writeAll(records);
            csvWriter.flush();
            csvWriter.close();
 
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }

这是我在 C# 中的代码(我是 .Net 的新手,所以我不确定很多部分)

     public void writeEnd(string runId)
        {
            var records = Enumerable.Empty<LocatorTime>();
            try
            {
                var config = new CsvConfiguration(CultureInfo.InvariantCulture)
                {
                    // Don't write the header again.
                    HasHeaderRecord = false,
                };

                using (var reader = new StreamReader(@"D:\Reports\" + runId + @"\LocatorTime.csv"))
                using (var csv = new CsvReader(reader, config))
                {
                    //csv.Context.RegisterClassMap<LocatorTime>();
                    records = csv.GetRecords<LocatorTime>().ToList();

                    foreach (var record in records)
                    {
                        if (record.RunID == runId)
                        {
                             record.TimeTakenByLocatorJSON = DateTime.Now;
                           }
                       // Console.WriteLine("inside loop");
                    }
                }//Endof Stream Reader
                
                using (var stream = File.Open(@"D:\Reports\" + runId + @"\LocatorTime.csv", FileMode.Append))  //not sure what the file mode should be 
                using (var writer = new StreamWriter(stream))
                using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
                {

                    csv.WriteRecords(records);

                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }//end func writeEnd

CSV 样本

    RunId     ProductArea       Product         Component          PageObject   Control TimeTakenByLocatorJson
Run_645987    R201              BN2018.5         N778              BC1                2021-07-19

这是用于 csv 文件的类,也是 csvfile 中的列名

    public class LocatorTime
    {
        
        public string RunID { get; set; }
        public string ProductArea { get; set; }
        public string Product { get; set; }
        public string Component { get; set; }
        public string PageObject { get; set; }
        public string Control { get; set; }
        public DateTime TimeTakenByLocatorJSON //only this value needs to be written for update at end of exec        
        {
            get;
            set;
        }/*error because of DateTime datatype how to resolve?*/  }//LocatorTimeClass 

/*public void SetExeDate() //tried this for removing DateTime error, didn't work
         {
             DateTime today = DateTime.Today; // As DateTime
             string s_today = today.ToString("yyyy-MM-dd"); // As String
             //TimeTakenByLocatorJSON = s_today.Trim();
             TimeTakenByLocatorJSON = Convert.ToDateTime(s_today);}

*/



    public sealed class LocatorTimeMap : ClassMap<LocatorTime> //is mapping helpful for updating? currently commented out
    {
        public LocatorTimeMap()
        {
            Map(m => m.RunID).Index(0);
            Map(m => m.ProductArea).Index(1);
            Map(m => m.Product).Index(2);
            Map(m => m.Component).Index(3);
            Map(m => m.PageObject).Index(4);
            Map(m => m.Control).Index(5);
          Map(m => m.TimeTakenByLocatorJSON).Index(6); //error
        }
    }

我注意到 3 件事。 1st - 在您的示例数据中,您有 7 个列标题,但只有 6 列数据。 第二 - “RunId”和“TimeTakenByLocatorJson”的类名与示例数据中的列不完全匹配。 第三 - 您的配置说“不要再写标题了。”,但您正在使用它进行阅读。

对于第一期,我将假设这是印刷错误,我将添加另一列数据。

对于第二个问题,至少有 3 种处理方法。 您已经通过映射到LocatorTimeMap索引来处理它。 我将通过将标题转换为小写来为您提供第二种方法。 第 3 种方法是使用name 属性

对于第三个问题,头有读,我想你想的头,当你写吧,这样你就可以离开HasHeaderRecord = false的。

void Main()
{
    writeEnd("Run_645987");
}

// You can define other methods, fields, classes and namespaces here
public void writeEnd(string runId)
{
    var records = Enumerable.Empty<LocatorTime>();
    try
    {
        var config = new CsvConfiguration(CultureInfo.InvariantCulture)
        {
            // This will convert both the header coming in and your class property to lower case.
            PrepareHeaderForMatch = args => args.Header.ToLower()   
        };

        var input = new StringBuilder();
        input.AppendLine("RunId,ProductArea,Product,Component,PageObject,Control,TimeTakenByLocatorJson");
        input.AppendLine("Run_645987,R201,BN2018.5,N778,BC1,control1,2021-07-19");
        
        using (var reader = new StringReader(input.ToString()))
        //using (var reader = new StreamReader(@"D:\Reports\" + runId + @"\LocatorTime.csv"))
        using (var csv = new CsvReader(reader, config))
        {
            records = csv.GetRecords<LocatorTime>().ToList();

            foreach (var record in records)
            {
                if (record.RunID == runId)
                {
                    record.TimeTakenByLocatorJSON = DateTime.Now;
                }
            }
        }//Endof Stream Reader

        //using (var stream = File.Open(@"D:\Reports\" + runId + @"\LocatorTime.csv", FileMode.Append))  //not sure what the file mode should be 
        //using (var writer = new StreamWriter(stream))
        using (var csv = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
        {
            csv.WriteRecords(records);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
}//end func writeEnd

public class LocatorTime
{
    public string RunID { get; set; }
    public string ProductArea { get; set; }
    public string Product { get; set; }
    public string Component { get; set; }
    public string PageObject { get; set; }
    public string Control { get; set; }
    public DateTime TimeTakenByLocatorJSON //only this value needs to be written for update at end of exec        
    {
        get;
        set;
    }
}//LocatorTimeClass 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM