Есть ли способ чтения данных из множества файлов, каждый столбец каждого файла должен быть сохранен в отдельный массив - PullRequest
2 голосов
/ 30 мая 2019

Я читаю имена и подробности каждого файла, а затем просматриваю их для теста в MessageBox.Можно ли записать каждый столбец всех файлов в отдельный массив?

Метеорологические карты

       var pathFiles = Directory.EnumerateFiles(@"C:\Meteo", "*.dat");

        List<string> lines = Directory.EnumerateFiles(@"C:\Meteo", "*.dat").SelectMany(file => File.ReadLines(file)).ToList();

        //Display only filenames.
        //foreach (string file in Directory.EnumerateFiles(@"C:\Meteo", "*.dat"))
        //{
        //    MessageBox.Show(file);
        //}

        foreach (string file in Directory.EnumerateFiles(@"C:\Meteo", "*.dat"))
        {
            // read each line
            foreach (string line in File.ReadLines(file))
            {
                // and show file name and line in a message box
                MessageBox.Show(line, file);
            }
        }

Я вижу данные визуализируемые, но яхочу отсортировать их в 11 отдельных массивах.

PIC (слишком много. * файлов данных с одинаковой структурой):

enter image description here

1 Ответ

2 голосов
/ 30 мая 2019

Сначала мы должны определить, что такое разделитель столбцов ;кажется, это либо табуляция или / и пробел :

var data = Directory
  .EnumerateFiles(@"C:\Meteo", "*.dat")
  .SelectMany(file => File.ReadLines(file))    
  .Select(line => line.Split(new char[] {'\t', ' '}, StringSplitOptions.RemoveEmptyEntries))
  .ToList();

Теперь пришло время pivot data:

var result = Enumerable
  .Range(0, data.Any() ? data[0].Length : 11)
  .Select(column => data
     .Select(line => line[column])
     .ToArray())
  .ToArray();

Итак, у вас будет массив 11 массивов (столбцов):

string demo = result[1][3]; // 1st column - (dates), 3d record

Однако я сомневаюсь, действительно ли вы хотите развернуть data.Я предлагаю превратить каждую строку в класс , например

var result = Directory
  .EnumerateFiles(@"C:\Meteo", "*.dat")
  .SelectMany(file => File.ReadLines(file))    
  .Select(line => line.Split(new char[] {'\t', ' '}, StringSplitOptions.RemoveEmptyEntries))
  .Select(items => new {
     id = items[0],
     date = DateTime.ParseExact(items[1], "dd-MM-yyyy", CultureInfo.InvariantCulture), 
     /* etc. */
   })
  .ToList();

, тогда, когда вы захотите работать, скажем, с date, вы можете иметь массив как

 var dates = result
   .Select(item => item.date)
   .ToArray(); 

Редактировать: или, если вы хотите видеть элементы (скажем, date и id) в окне сообщения (см. Комментарий ниже), все, что вам нужно, это foreach:

 foreach (var item in result)) {
   MessageBox.Show($"{item.date} and {item.id}");
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...