Преобразование списка «word, word \ n» в текстовом файле в массив [,] - получение ошибки - PullRequest
0 голосов
/ 07 октября 2019

У меня есть список почтовых индексов и городов, для которых коды указаны в текстовом файле. Данные выглядят так:

2450,København SV
2500,Valby
2600,Glostrup
2605,Brøndby
2610,Rødovre
2625,Vallensbæk
2630,Taastrup
2635,Ishøj
2640,Hedehusene

Там есть 580 строк текста.

Я начал с преобразования текста в неровный массив [] [], но это не совсем соответствует моим потребностям. вместе в моем коде. Поэтому предпочтителен простой массив [,].

К сожалению, я, очевидно, слишком новичок в c #, чтобы иметь возможность самому туда добраться.

        string testing = File.ReadAllText(@"U:\Testing.txt");
        int i = 0, j = 0;
        string[,] result = new string[580, 2];
        foreach (var row in testing.Split('\n'))
        {
            j = 0;
            foreach (var col in row.Trim().Split(','))
            {
                result[i, j] = col.Trim();
                j++;  //Line 26 - this is where I get the exception error
            }
            i++;
        }

Я не могу понять, почему я получаю следующую ошибку, и я начал рвать на себе волосы. Есть идеи ??

System.IndexOutOfRangeException
  HResult=0x80131508
  Message=Index was outside the bounds of the array.
  Source=Testing
  StackTrace:
   at Testing.Analysis.Main() in U:\Uddannelse\Testing\Testing\Program.cs:line 26

Ответы [ 4 ]

3 голосов
/ 07 октября 2019

Вы получаете ошибку, потому что где-то в вашем файле некоторые строки имеют запятую в названии города.

Если вы хотите получить полное имя, попробуйте что-то вроде этого -

var row = "2450,København, SV"
var values = row.Split(new[] {','}, 2);
//With the extra int param to the Split function, you are saying no matter how many substrings you can form , only give me this specific number of substrings.
//With a value of 2, you are essentially splitting at the first instance of the comma.  

Это даст вам два значения, первое из которых «2450», а второе «København, SV»

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

0 голосов
/ 07 октября 2019

Как сказал Iv Misticos , не лучше ли было бы использовать Dictionary вместо массива?

Попробуйте:

string data = File.ReadAllText(@"U:\Testing.txt");
Dictionary<string, string> dic = new Dictionary<string, string>();

foreach (string line in data.Split('\n'))
{
    if(line.IndexOf(",") > 0)
        dic.Add(line.Substring(0, line.IndexOf(",")).Trim(), 
        line.Substring(line.IndexOf(",") + 1).Trim());
}
0 голосов
/ 07 октября 2019

Вы можете попробовать это, чтобы исправить индексацию.

static void Test()
{
  var testing = File.ReadAllLines(@"c:\Testing.txt");
  string[,] result = new string[testing.Length, 2];
  int i = 0, j = 0;
  foreach ( var line in testing )
  {
    j = 0;
    foreach ( var col in line.Trim().Split(',') )
      result[i, j++] = col.Trim();
    i++;
  }
  for ( int index = result.GetLowerBound(0); index < result.GetUpperBound(0); index++ )
      Console.WriteLine($"Code = {result[index, 0]}, Name = {result[index,1]}");
}
0 голосов
/ 07 октября 2019

Вот один из способов подойти к этому:

string file_path = "...";
//read all lines from the file
var lines = File.ReadAllLines(file_path);

//You could also use StreamReader to read the file in line by line

string[,] result = new string[lines.Length, 2];
string line;
char[] separator = new char[] { ',' };

//loop over the lines until the end of the file
for(int current_line = 0; current_line < lines.Length; current_line++)
{
    //second argument limits you to two parts, so additional commas will not cause issues
    var parts = line.Trim().Split(separator, 2); 
    //make sure the data was in your expected format (i.e. two parts)
    if(parts.Length == 2)
    {
        result[current_line, 0] = parts[0];
        result[current_line, 1] = parts[1];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...