【问题标题】:How to read string value from DataTable1.Row[i][j] into an array or multiple rows of DataTable2如何将 DataTable1.Row[i][j] 中的字符串值读取到 DataTable2 的数组或多行中
【发布时间】:2019-07-26 03:36:55
【问题描述】:

我正在将 csv 文件读入dataTable1。其中一列的每一行都有多个值。我想将这些多个值存储在一个数组中。

我的 csv 文件是这样的

my dataTable1 has ID and Admin values. 
    dataTable1.Rows[i][1] = 
    [{"@odata.type":"#Microsoft.Azure","Claims","DisplayName1","Department"}]

我想遍历 dataTable1 中的每一行并使用 "," 分隔符拆分此字符串并写入 dataTable2。类似的东西

dataTable2.Rows[i][1] = "....Microsft..."
dataTable2.Rows[i][2] = "Claims"
dataTable2.Rows[i][3] = "DisplayName1"

。 .

【问题讨论】:

  • 解决方法之一是将数组转换为json字符串

标签: c# arrays datatable


【解决方案1】:

我无法真正理解您发布的示例代码,因为 c# 数组不能这样工作,但您要么想将 csv 列分散到多个数据表列中:

DataTable dt = new DataTable();
dt.Columns.Add("something");
dt.Columns.Add("name");
dt.Columns.Add("displayname");
dt.Columns.Add("location");
dt.Columns.Add("ID");

string csv = @"someth1,{jon}{jonno}{newyork}{1}
Someth2,{jane}{janey}{paris}{2}";

foreach(string line in csv.Split()){
  string bits = line.Split(',');
  List<string> itm = new List<string>();
  itm.Add(bits[0]);
  itm.AddRange(bits[1].Split("{}".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
  dt.Rows.Add(itm.ToArray());
}

或者您想将其作为数组存储在单个数据表列中:

DataTable dt = new DataTable();
dt.Columns.Add("something");
dt.Columns.Add("info", typeof(string[]));

string csv = @"someth1,{jon}{jonno}{newyork}{1}
someth2,{jane}{janey}{paris}{2}";

foreach(string line in csv.Split()){
  string bits = line.Split(',');
  string info = bits[1].Split("{}".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
  dt.Rows.Add(new object[] { bits[0], info });
}

这不是模型 CSV 解析的练习/示例。我假设您已经有一个很好的库来执行此操作,因此 bits 数组表示该库的输出

这里的关键是如何处理你的花括号分隔列表;有很多选择,犀牛绝不是唯一的。它相对简单,但是您还没有发布大量示例来了解您正在处理的种类。如果可以转义例如大括号,它可能需要一些升级。告诉 CSV 解析器 ,{} 是所有用于分隔字段的标记时,您可能也会很高兴


编辑,以回应您的问题修订:

DataTable dt1 = new DataTable();
dt1.Columns.Add("ID");
dt1.Columns.Add("CSV");
dt1.Rows.Add(new object[] { "1", "[{\"@odata.type\":\"#Microsoft.Azure\",\"Claims\",\"DisplayName1\",\"Department\"}]" } );

DataTable dt2 = new DataTable();
dt2.Columns.Add("ID");
dt2.Columns.Add("Provider");
dt2.Columns.Add("Department");
dt2.Columns.Add("Displayname");
dt2.Columns.Add("OtherDept");



foreach(DataRow ro in dt1.Rows){
  string csv = ro[1].ToString();
  csv = csv.Trim('[',']','{','}','"'); //remove leading and trailing chars that mess up our splitting
  string bits = csv.Split(new []{"},{"}); //split on a string delimiter of "},{". note: new[]{"abc","def"} is c# shorthand to declare an array of strings containing [0]="abc" and [1]="def"

  // our dt2 has 5 columns
  dt2.Rows.Add(new object[] {
       ro["ID"],
       bits[1],
       bits[2],
       bits[3],
       bits[4]
     }
  );

}

【讨论】:

  • 感谢 Caius,但是我添加了我的 csv 文件的图片以及我想要实现的目标。抱歉,我是 C# 新手
  • 您应该能够调整我的示例之一以满足您的需要
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2019-05-14
  • 2014-04-22
  • 2012-10-20
  • 2017-12-09
相关资源
最近更新 更多