Преобразование строкового массива в двойной массив

У меня есть файл с множеством чисел, в каждом индексе 4 подномера

no1 no2 no3 no4 
no1 no2 no3 no4 
no1 no2 no3 no4 

Это файл cvs, но мне нужно прочитать числа в массиве как тип double и выполнить интерполяцию, поэтому мне нужно пройтись по таблице.

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

var filelines = from line in file.Skip(5)
                select line.Split(';');

person Jedhi    schedule 10.02.2015    source источник
comment
Можете ли вы показать нам пример вашего ввода и желаемого результата?   -  person LukeH    schedule 10.02.2015
comment
Какой желаемый результат?   -  person Rohit    schedule 10.02.2015
comment
почему вы используете Skip (5)? если вы пытаетесь пропустить заголовок, разве это не должно быть Skip (1)?   -  person Selman Genç    schedule 10.02.2015
comment
Вам нужно сохранить линии, таким образом, одна двойная [] на строку или одна двойная [] в целом?   -  person Tim Schmelter    schedule 10.02.2015
comment
@ Selman22: иногда первые строки содержат не только заголовок, но и информацию о файле или резюме.   -  person Tim Schmelter    schedule 10.02.2015
comment
ввод 2.0; 4.8; 20,0; 34,8 \ п 3,0; 6,8; 60,0; 74.8 желаемый результат - это массив типа double, содержащий четыре числа для каждого индекса.   -  person Jedhi    schedule 10.02.2015


Ответы (3)


Если вам нужен double[][], поэтому по одному массиву на строку:

double d;
double[][] lineValues = file.Skip(5)
    .Select(l => l.Split(new[]{';'}, StringSplitOptions.RemoveEmptyEntries))
    .Where(arr => arr.Length == 4 && arr.All(s => double.TryParse(s, out d)))
    .Select(arr => arr.Select(double.Parse).ToArray())
    .ToArray();
person Tim Schmelter    schedule 10.02.2015
comment
Спасибо, строки пустые. Я попытался создать экземпляр lineValues ​​с помощью lineValues ​​= new lineValues ​​(file.count), но не работает. Я что-то здесь упускаю? И я могу сделать это [] [] [] [] так, чтобы это был массив Quattro? - person Jedhi; 10.02.2015
comment
@Jedhi: что такое массив quattro? Зачем тебе такая штука? В приведенном выше double[][] каждая строка транспонирована в double[], так что вы получаете один массив для каждой строки, содержащей значения всех полей. Почему не работает? Может потому, что у вашего файла другая структура. Я добавил строгое правило проверки: .Where(arr => arr.Length == 4 && arr.All(s => double.TryParse(s, out d))). Возможно, строки содержат более 4 полей или меньше, или не все могут быть проанализированы для удвоения. - person Tim Schmelter; 10.02.2015
comment
Привет, Тим. Он работает, когда я удаляю строку .Where (arr = ›arr.Length == 4 && arr.All (s =› double.TryParse (s, out d))). Файл выглядит как # # # # # 10; 2,0; 0; 0 30; 4; 0; 0 50; 6; 0; 0 70; 8; 0; 0 Структура всегда одна и та же. Будет ли он пытаться разобрать на удвоение, если будет 4 числа? - person Jedhi; 10.02.2015
comment
@Jedhi: в комментарии невозможно увидеть файловую структуру. Пожалуйста, отредактируйте свой вопрос, указав образцы строк в правильном формате (с разрывами строк и т. Д.). Он будет пытаться разобрать строку на double[], только если есть 4 числа. - person Tim Schmelter; 10.02.2015
comment
Теперь это работает. Большое спасибо за вашу помощь и время. Я это очень ценю. Если бы возможно, дал бы вам больше очков ;-) - person Jedhi; 10.02.2015
comment
моя вина. Должен был принять твой ответ сейчас. Еще раз спасибо. - person Jedhi; 10.02.2015
comment
Если вы хотите иметь многомерный массив [,] вместо зубчатого массива [] [] в приведенном выше примере, как тогда написать оператор linq? - person Jedhi; 19.02.2015
comment
@Jedhi: многомерные массивы и LINQ не работают вместе. Вы можете посмотреть здесь: stackoverflow.com/questions/18896150/ - person Tim Schmelter; 19.02.2015
comment
Спасибо, я догадался. - person Jedhi; 19.02.2015

Вы можете разделить строку, разбить каждую часть на десятичные дроби и использовать SelectMany для сглаживания результатов:

file.Skip(5).SelectMany(line => line.Split(';').Select(decimal.Parse)).ToArray()
person Selman Genç    schedule 10.02.2015
comment
Как сделать массив Quattro? могу я написать double [] [] [] [] = file.skip (5) ... или любое предложение? - person Jedhi; 10.02.2015

Если в каждой строке есть определенные значения, например, предположим, что ваше хранилище данных cvs имеет определенное количество полей, более разумным и строго типизированным шагом будет создание модели для вашего хранилища данных, которая, согласно предоставленной вами информации, будет :

public class MyCVSModel {
    public Double Number1 {get; set;} 
    public Double Number2 {get; set;} 
    public Double Number3 {get; set;} 
    public Double Number4 {get; set;} 
}

Теперь вы можете:

public static IEnumerable<MyCVSModel> Converion(String FileName){
     var AllLines = System.IO.ReadAllLines(FileName);
     foreach(var i in AllLines){
        var Temp = i.Split('\t'); // Or any other delimiter
        if (Temp.Lenght >= 4){ // 4 is because you have 4 values in a row
           List<Double> TryConversion = new List<Double>();
           foreach(var x in Temp) {
              if (IsDouble(x))
                 TryConversion.Add(Convert.ToDouble(x));
              else
                 TryConversion.Add(0);
           }
           MyCVSModel Model = new MyCVSModel();
           Model.Number1 = TryConversion[0];
           Model.Number2 = TryConversion[1];
           Model.Number3 = TryConversion[2];
           Model.Number4 = TryConversion[3];
           yield return Model;
        }
     }
}

public static Boolean IsDouble(String Value) {
    Regex R = new Regex(@"^[0-9]*(?:\.[0-9]*)?$");
    return R.IsMatch(Value);
}
person Transcendent    schedule 10.02.2015