Входная строка не была в правильном формате String для массива double [] []

Я знаю, что здесь есть больше тем на эту тему, но на самом деле ни одна из них мне не помогла.

Я предоставлю весь код:

namespace ConsoleApplication1
{
    public static class Load
    {
        public static double[][] FromFile(string path)
        {
            var rows = new List<double[]>();
            foreach (var line in File.ReadAllLines(path))
            {
                // HERE IS THE ERROR
                rows.Add(line.Split(new[] { ' ' }).Select(double.Parse).ToArray());  
            }
            return rows.ToArray();
        }
    }

    public class Program
    {

        static void Main( string [ ] args )
        {
            string cestain = @"E:\vstup.txt";
            double[][] innput = Load.FromFile(cestain);

            string cestaout = @"E:\vystup.txt";
            double[][] ooutput = Load.FromFile(cestaout);


            // c r e a t e a neural network
            var network = new BasicNetwork ( ) ;
            network . AddLayer (new BasicLayer ( null , true , 2) ) ;
            network . AddLayer (new BasicLayer (new ActivationSigmoid ( ) , true , 3) ) ;
            network . AddLayer (new BasicLayer (new ActivationSigmoid ( ) , false , 1) ) ;
            network . Structure . FinalizeStructure ( ) ;
            network . Reset( );

            // c r e a t e t r a i n i n g data
            IMLDataSet trainingSet = new BasicMLDataSet (innput , ooutput ) ;
            // t r a i n the neural network
            IMLTrain train = new ResilientPropagation (network , trainingSet) ;
            int epoch = 1 ;
            do
            {
                train.Iteration( ) ;
                Console.WriteLine(@"Epoch #" + epoch + @" Error : " + train.Error );
                epoch++;
            } while ( train.Error> 0.01 ) ;

            Console.ReadLine();
        }
    }
}

Вот что я пытаюсь загрузить в double[][] вход:

166 163 180 228

165 162 160 226

166 163 180 228

166 164 180 228

171 162 111 225

Вот что я пытаюсь загрузить в double[][] выход:

1 0 0

1 0 0

0 1 0

0 1 0

1 0 0

2 ответа

Решение

Проблема: у вас есть дополнительные пустые строки после каждой строки в вашем текстовом файле. когда функция Split() встречает новую строку, она возвращается, потому что нечего разбивать и Add() функция выдает исключение, так как пустая строка недопустима Double,

Решение 1: Вы можете использовать StringSplitOptions.RemoveEmptyEntries в качестве второго аргумента Split() функция, чтобы игнорировать EmptyLines.

        foreach (var line in File.ReadAllLines(path))
            {
                // HERE IS THE ERROR
                rows.Add(line.Split(new[] { ' ' },StringSplitOptions.RemoveEmptyEntries).Select(double.Parse).ToArray());  
            }

Решение 2: вы можете проверить, пустая линия или нет, используя String.IsNullOrWhiteSpace()

          foreach (var line in File.ReadAllLines(path))
            {
              if(!String.IsNullOrWhiteSpace(line))
              {
                // HERE IS THE ERROR
                rows.Add(line.Split(new[] { ' ' },StringSplitOptions.RemoveEmptyEntries).Select(double.Parse).ToArray());  
              }                
            }

У меня была похожая проблема не так давно. С помощью StringSplitOptions.RemoveEmptyEntries решил это для меня. Так и становится, lines.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)

Это помогает, потому что вы получаете пустые строки, поэтому RemoveEmptyEntries удаляет эти строки из результата метода Split.

Другие вопросы по тегам