c # Разделение строки на многомерный массив? - PullRequest
1 голос
/ 01 октября 2019

Я столкнулся с небольшой проблемой, которую я не могу понять. У меня есть обычный 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 строк.

Спасибо!

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Вы можете попробовать что-то вроде этого: Split каждый элемент с arrayin на | и записать эти куски в строку двумерного массива:

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);
0 голосов
/ 01 октября 2019

Если количество элементов в строке варьируется, вы можете использовать зубчатый массив.

Мы создаем пустой массив и устанавливаем размер счетчика строк.

Затем мы анализируем все строкисписок и для всей строки мы разбиваем его, чтобы получить нужные элементы для добавления их в измерение при изменении размера под-массива строки.

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

Вы также можете использовать список из списка строк и использовать методAdd():

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