c#将字符串拆分为多维数组?

Posted

技术标签:

【中文标题】c#将字符串拆分为多维数组?【英文标题】:c# Splitting string to a multi dimensional array? 【发布时间】:2020-01-30 16:48:35 【问题描述】:

我遇到了一个我无法理解的小问题。 我有正常的string[] 数组,其中包含文本导入。每一行都单独存储在每个索引下。 一行通常看起来像这样:

string[i] = |title1|title2|title3|title4|title5|
string[i+1] = |Word1|Word2|Word3|Word4|Word5|

我想拆分这些行并将它们放入一个多维数组。 已经计算了我必须如何声明数组的维度。 我现在想拆分它。我正在考虑用两个循环遍历普通数组并查找分隔符,同时将单词保存在字符串中,然后将其复制到多数组中。

你们知道我该怎么做吗,因为对于这么小的事情来说太麻烦了。

我希望多数组看起来像这样:

string[0,0] = title1, 
string[0,1] = title2 etc. 
string[1,0] = word1 
string[1,1] = word2

这是创建数组的代码:

public string [,] SplitArrays(string [] arrayin)

    long columns = 0;
    char line = '|';

    string row;
    for(int i = 0; i < arrayin.Length;i++)
    
        row = arrayin[i];
        if (Convert.ToChar(row.Substring(0, 1)) == line)
        
            for(int j = 0; j < row.Length;j++)
            
                if (Convert.ToChar(row.Substring(j,(j+1))) == line)
                
                    columns++;
                                           
            
        
        break;
    
    int rowlength = arrayin.Length;
    string[,] finalarray = new string[columns,rowlength];

这就是我分离的程度,但我有点困惑,我可能搞砸了:

    int rowcolumncount = 0;
    string word = "";
    bool next = false;
    for(int k = 0; k < arrayin.Length; k++)
    
        row = arrayin[k];

        for(int l = 0; l < row.Length; l++)
        
            if (Convert.ToChar(row[l]) == line)
            
                for(int z = 0; next == false;)
                
                    if(row[z] == line)
                    
                        next = true;
                    
                    else
                    
                        string part = Convert.ToString(row[z]);
                        word = string.Join("",part);
                    
                    finalarray[l, rowcolumncount] = word;
                    rowcolumncount++;
                
            
            rowcolumncount = 0;
        

    

    return finalarray;

主数组包含大约 12000 行。

谢谢!

【问题讨论】:

嗨,您当前的代码到底有什么问题?你考虑过Split函数吗? 【参考方案1】:

您可以尝试这样的操作:Split 每个项目与arrayin by | 并将这些块写入一行二维数组:

public string[,] SplitArrays(string[] arrayin) 
  if (null == arrayin)
    return null;
  else if (arrayin.Length <= 0)
    return new string[0, 0];

  // null : we don't know size (number of columns) before 1st line split
  string[,] result = null;

  int row = 0;

  foreach (var line in arrayin) 
    string[] items = line.Split('|');

    // - 2 : skip the very first and the very last items which are empty
    if (null == result)
      result = new string[arrayin.Length, items.Length - 2];

    // if line is too short, let's pad result with empty strings
    for (int col = 0; col < result.GetLength(1); ++col)
      result[row, col] = col + 1 < items.Length - 1 
        ? items[col + 1] 
        : "";            // padding

    row += 1;
  

  return result;

用法:

  string[] source = new string[] 
    "|title1|title2|title3|title4|title5|",
    "|Word1|Word2|Word3|Word4|Word5|",
  ;

  // 
  //   "title1", "title2", "title3", "title4", "title5",
  //    "Word1",  "Word2",  "Word3",  "Word4",  "Word5"
  // 
  string[,] array = SplitArrays(source);

【讨论】:

谢谢!像黄油一样工作。我不得不从源文件中删除一些行,因为前几行包括该方法无法处理的创建日期等。【参考方案2】:

如果每行的项目数不同,可以使用交错数组。

我们创建空数组并设置行数大小。

然后我们解析列表中的所有行,并在调整行子数组大小时将所有行拆分为所需的项目以将它们添加到维度中。

static public void Test()

  var list = new string[]
  
    "| title1 | title2 | title3 | title4 | title5 |",
    "| Word1 | Word2 | Word3 | Word4 | Word5 |"
  ;

  int indexD1 = 0;
  string[][] result = null;
  Array.Resize(ref result, list.Length);
  foreach ( string item in list )
  
    var str = item;
    str = str.TrimStart('|').TrimStart();
    str = str.TrimEnd('|').TrimEnd();
    str = str.Replace(" | ", "|");
    var items = str.Split('|');
    Array.Resize(ref result[indexD1], items.Length);
    int indexD2 = 0;
    foreach ( string part in items )
      result[indexD1][indexD2++] = part;
    indexD1++;
  

  foreach ( var row in result )
  
    foreach ( var str in row )
      Console.WriteLine(str);
    Console.WriteLine();
  

您也可以使用 List of Strings 并使用方法Add()

var result = new List<List<string>>();

【讨论】:

以上是关于c#将字符串拆分为多维数组?的主要内容,如果未能解决你的问题,请参考以下文章

我需要在拆分方法c#之后将字符串分配给数组列

C#将具有随机空格的字符串拆分为字符串数组[关闭]

如何首先“将字符串拆分为数组”然后“向该数组添加内容”? || C# 控制台应用程序

C#:如何将多个字符串拆分为二维数组?

C# 无法通过换行符将字符串拆分为数组(来自 StreamReader)

c#中的字符串拆分返回一个空数组