简体   繁体   English

如何从DataTable1.Row [i] [j]读取字符串值到DataTable2的数组或多行中

[英]How to read string value from DataTable1.Row[i][j] into an array or multiple rows of DataTable2

I am reading a csv file into a dataTable1 . 我正在将csv文件读取到dataTable1 One of the column has multiple values for each row. 一列中的每一行都有多个值。 I want to store those multiple values in an array. 我想将这些多个值存储在数组中。

my csv file is something like this 我的csv文件是这样的

在此处输入图片说明

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

i want to loop through each Row in dataTable1 and split this string using "," delimiter and write to dataTable2. 我想遍历dataTable1中的每一行,并使用","定界符拆分此字符串并写入dataTable2。 Something like 就像是

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

. .

I couldn't really make sense of the example code you posted because c# arrays don't work like that but you either want to spread your csv column into multiple datatable columns: 我不能真正理解您发布的示例代码,因为c#数组不能那样工作,但是您要么想将csv列散布到多个datatable列中:

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());
}

or you want to store it as an array in a single datatable columns: 或者您要将其作为数组存储在单个datatable列中:

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 });
}

This is not an exercise/example of model CSV parsing. 这不是模型CSV解析的练习/示例。 I'm assuming you have a good library doing that already and the bits array hence represents the output from that library 我假设您已经有一个很好的库,并且bits数组因此代表了该库的输出

Key here is how to deal with your curlybracket delimited list; 这里的关键是如何处理花括号分隔列表; there are plenty of options and rhino by no means the only one. 有很多选择,而犀牛绝不是唯一的选择。 It's relatively unsophisticated, but you haven't posted a massive example to know what kind of variety you're dealing with. 它相对来说并不复杂,但是您尚未发布大量示例来了解您要处理的是哪种品种。 It may need some upgrades if eg curly brackets can be escaped. 如果可以避免例如花括号,则可能需要进行一些升级。 You might also have some joy in telling your CSV parser that ,{} are all tokens that delimit fields 告诉CSV解析器,{}都是用于分隔字段的标记,您可能也会感到高兴


Edit, in response to your question revision: 根据您的问题修订进行编辑:

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]
     }
  );

}

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

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