2014-07-12 7 views
-1

Помощь !!! Привет, я нашел следующий код в Интернете, который предназначен для преобразования текстового файла (с некоторым дополнительным форматированием) в double t [] []. Однако он утверждает, что ввод строки был неправильным, есть ли кто-нибудь, кто знает, что делать, чтобы разрешить это? Основной код - это глубокая обучающая нейронная сеть, которую я хочу отлаживать и запускать, пожалуйста, помогите мне захотеть поделиться кодом после его отладки? См. Ниже код нарушения!C# - Преобразование текстовой строки в двойной массив [] []?

public static class DataParser 
{ 

    public static double[][] Parse(string filePath) 
    { 


     [email protected]"C:\Users\DRS\Desktop\rbm2\SimpleRBM-master\optdigits-tra.txt"; 
     var x = File.ReadAllText(filePath); 

     x = x.Replace("\r\n", ""); 

     var y = x.Split(" ".ToCharArray()); 

     var t = 
      y. Select(
       s => 
       s.Substring(1).PadRight(1024, '0').Select(
       n => double.Parse(n.ToString(CultureInfo.InvariantCulture))).ToArray()).ToArray(); 

     return t; 

    } 


} 
+0

Является ли входной файл в формате '5.2' или' 5,2'? – Mephy

+0

Вы имеете в виду это? https://github.com/erezrob/SimpleRBM – ziya

ответ

1

Вы используете LINQ Select на string. Когда string используется как IEnumerable, вы получаете каждый символ в отдельности.

Затем вы преобразовываете символ в строку, используя ToString(InvariantCulture), что бесполезно.

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

Вызов ToString() непосредственно перед Parse всегда код запах. Вероятно, вы имели в виду разбить на основе строк, что лучше всего сделать с использованием метода ReadAllLines во входном файле. Затем разделите пробелы в каждой строке.

return File.ReadAllLines(filePath) 
       .Select(x => x.Split(' ').Select(double.Parse).ToArray()).ToArray(); 

Однако, поскольку Максвелл связал свои входные данные в комментариях, я вижу, что вы на самом деле не пытаетесь разобрать двойники вообще. Попробуйте это:

return File.ReadAllLines(filePath).Where(x => x.Length > 10) 
       .Select(x => x.ToCharArray().Select(x => x-'0').ToArray()).ToArray(); 

Это будет int[][], отражая тот факт, что ваши цифры являются двоичными, ни фракции вообще. Также обратите внимание, что я просто отбрасываю аннотации о том, что цифра фактически представляет. То, что вы, вероятно, хотите, - это лучший парсер, который фактически возвращает список (, char) пар, которые имеют растровые данные и аннотации для каждого учебного ввода.

+0

@AlexD: Это было два опечатка, спасибо, что указали их. –

+0

Вы имели в виду что-то вроде '.Where (x => x.Length> 10) .Выберите (x => x.ToCharArray(). Выберите (y => y - '0'). ToArray()). ToArray () '? – AlexD

+0

@Alex: Да. Такая же проблема была в обоих решениях. –

Смежные вопросы