【问题标题】:Increment ID during writing to the file (C#, CSV)在写入文件期间增加 ID(C#、CSV)
【发布时间】:2018-09-12 12:12:52
【问题描述】:

我正在读取 XLS 文件并将数字(来自 excel = currow 的当前行)传递给在新 csv 文件中创建对象的方法:

public class Importer
...
IList<NewDataObj> n_obj = new List<NewDataObj>();    
foreach (var item in data.AsEnumerable().Where(o => o.Field<string>("MyID") == ImportID)){             

         n_obj.Add(new NewDataObj(item, ID, currow));
         currow++;}
....

创建新DataObj的方法:

public class NewDataObj{
....
 public static string_1  = "\"{3}\";\"NEW_OBJECT\";\"TEST\"{5}\";
 public static string_2  = "\"{3}\";\"NEW OBJECT\";\"TEST_A2\"{5}\";
 public double DataID { get; set; }
.....
 public NewDataObj(DataRow item, string newID, int currow){
  ....
  ID = string.Format("{{ABC_TEST_{0:000}}}", currow);
  AddtoFile_A();
  //AddtoFile_A2();
 }

 public void AddtoFile_A(){
  using (StreamWriter w = File.AppendText("testX.csv"))
   {
    w.WriteLine(string.Format(string_1, DataID, ID, Environment.NewLine));
   }
 }
}       

这工作正常,但现在我必须添加 AddtoFile_A2 方法。

public void AddtoFile_A2(){
  using (StreamWriter w = File.AppendText("testX.csv"))
 {
 w.WriteLine(string.Format(string_2, DataID, ID, Environment.NewLine));
 }
}

AddtoFile_A2 也使用相同的 currow。对我来说,当 AddtoFile_A 或 AddtoFile_A2 被执行时,ID 应该总是加 1。

如何做到这一点?也许我的 AddtoFile 方法应该将值返回给 Importer 类?

【问题讨论】:

  • 您似乎没有在发布的代码中的任何地方增加 currow 并且您需要重新创建 ID 字符串
  • @Steve...class Importer currow++

标签: c# csv streaming increment


【解决方案1】:

使用 CsvHelper 而不是手动编写 csv。

var data = new[] {
    new BuisnessObject{ Id=1, Name="FOO" },
    new BuisnessObject{ Id=2, Name="BAR" }
};

if (data.Any())
{
    // RowNumber=index or RowNumber=index+1 
    var ouputs = data.Select(
                        (item, index) => 
                        new OuputType {
                           Id=item.Id,
                           Name=item.Name,
                           RowNumber=index 
                        }
                    );

    using (TextWriter writer = new StreamWriter($"OuputFileName.csv"))
    using (var csv = new CsvWriter(writer))
    {
        csv.Configuration.RegisterClassMap<TestMap>();
        csv.WriteHeader<OuputType>();
        csv.NextRecord();
        csv.WriteRecords(ouputs);
    }
}

public sealed class BuisnessObject
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public sealed class OuputType
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int RowNumber { get; set; }
}

public sealed class TestMap : ClassMap<OuputType>
{
    public TestMap()
    {
        Map(m => m.Id);
        Map(m => m.Name);
        Map(m => m.RowNumber);
    }
}

您可以通过在 TestMap 类中的地图上移动来对列进行排序。或使用.Name("PrettyName")更改名称

【讨论】:

  • 我选择有一个选择来映射而不是直接使用映射器作为一个简单的例子,如果你在 buizness 和 Csv 对象之间有一个更复杂的映射,你可以在选择中添加它。像精选的许多或类似的东西。使用旧映射比学习如何使用新库更容易。
  • 如果我使用 SELECT * FROM [Sheet1$] 从我的 excel 中获取所有数据,它也能正常工作吗?
  • 我很困惑。这里我的变量 data 有点代表 excel 数据。它与您在问题中显示的数据不同。但要回答这个问题,是的。从您的 excel 中选择所有行,data.AsEnumerable()。过滤你想要的,.Where(o =&gt; o.Field&lt;string&gt;("MyID") == ImportID。这部分正是你所拥有的。
  • 现在是投影,将对象转换为新形式,通常只包含随后将使用的那些属性。_ .Select(x=&gt; new MyClass(){ Property1 = (string)x.Field&lt;string&gt;("ColumnName1"), Property1 = (int)x.Field&lt;int&gt;("ColumnName2"), Property1 = (bool)x.Field&lt;bool&gt;("ColumnName3"), })
  • @4est,因为我不确定我是否理解我试图过度澄清的问题。我会在 2-3 小时左右随意问任何问题
【解决方案2】:

刚从我的同事那里得到答案 - 应该传递为ref int currow

public class Importer
...
IList<NewDataObj> n_obj = new List<NewDataObj>();    
foreach (var item in data.AsEnumerable().Where(o => o.Field<string>("MyID") == ImportID)){             

         n_obj.Add(new NewDataObj(item, ID, ref currow));//one change
         currow++;}
....

并进入方法:

public class NewDataObj{
.....
 public NewDataObj(DataRow item, string newID, ref int currow){ //second changes
  ....
  ID = string.Format("{{ABC_TEST_{0:000}}}", currow);
  AddtoFile_A();

  currow++; //next changes
  ID = string.Format("{{ABC_TEST_{0:000}}}", currow); //new id
  AddtoFile_A2();
 }

刚刚测试过,工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2011-08-19
    • 2013-03-10
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多