Инкремент ID во время записи в файл (C #, CSV) - PullRequest
0 голосов
/ 12 сентября 2018

Я читаю файл 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 также использует ту же кривую.Для меня, когда AddtoFile_A или AddtoFile_A2 выполняется, ID всегда должен увеличиваться на 1.

Как это сделать?Может быть, мой метод AddtoFile должен возвращать значение в класс Importer?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Только что получил ответ от моего коллеги - должен быть передан как 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();
 }

Только что протестирован и работает нормально.

0 голосов
/ 12 сентября 2018

Использование 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")

...