2016-05-30 5 views
2

Привет, я хочу читать целые числа из файла, например, я хочу прочитать вектор из файла, подобного этому (0,0,0), и я хочу сохранить каждый параметр, x = 0 y = 0 z = 0 как можно разбить строку и сохранить целое число. У меня есть программа чтения, которая читает целые числа, но проблема возникает, когда у меня есть двойное целое число diggit, программа не считывает правильные значения. Мой текстовый файл что-то вроде этого:сплит целые числа между разными символами

:Cube.Attach(100,0,5); 
:Tree.Attach(10,0,50); 
:Plane.Attach(0,0,0); 
:Terrain.Attach(0,0,0); 
+0

либо использовать регулярные выражения или простой формат файла, в котором каждый v ector находится в новой строке, а числа разделяются пробелами, таким образом вы можете просто использовать 'string.split'. В любом случае, для более сложных данных вы не должны использовать txt-файлы в любом случае. Вам лучше использовать XML. – TheDjentleman

+0

* «проблема возникает, когда у меня есть двойное целое число diggit» * - в чем проблема? Исключение? Что-то не работает? Можете ли вы показать свой код, дать примерный ввод и показать произведенный и ожидаемый результат? – Sinatr

+0

Это формат, который я должен использовать, так как моя программа также ищет, существует ли метод Attach в этом примере. Тогда я буду использовать регулярные выражения. Спасибо за ваш ответ – anthraxa

ответ

3

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

// Possible operations 
    Dictionaty<String, Func<int, int, int, MyObject>> operations = 
    new Dictionaty<String, Func<int, int, int, MyObject>>() { 
     {"Cube.Attach", (x, y, z) => Cube.Attach(x, y, z);}, 
     {"Tree.Attach", (x, y, z) => Tree.Attach(x, y, z);}, 
     {"Plain.Attach", (x, y, z) => Plain.Attach(x, y, z);}, 
     {"Terrain.Attach", (x, y, z) => Terrain.Attach(x, y, z);}, 
     ... 
    } 
    ... 

    // Please, notice spaces and minus sign (-125) 
    String source = ":Cube.Attach(100, 18, -125);"; 

    ... 

    String pattern = @"^:(?<Func>[A-Za-z.]+)\((?<Args>.+)\);$"; 

    Match match = Regex.Match(source, pattern); 

    if (match.Success) { 
    // Operation name - "Cube.Attach" 
    // Comment it out if you don't want it 
    String func = match.Groups["Func"].Value; 

    // Operation arguments - [100, 18, -125] 
    int[] args = match.Groups["Args"].Value 
     .Split(',') 
     .Select(item => int.Parse(item, CultureInfo.InvariantCulture)) 
     .ToArray(); 

    // Let's find out proper operation in the dictionary and perform it 
    // ... or comment it out if you don't want perform the operation here 
    operations[func](args[0], args[1], args[2]); 
    } 

В случае, если вы хотите разделить "(0,0,0)" у вас нет необходимости в регулярных выражениях, так Split и Trim достаточно:

String source = "(100, 18, -125)"; 

    // [100, 18, -125] 
    int[] args = source 
    .Trim('(', ')') 
    .Split(',') 
    .Select(item => int.Parse(item, CultureInfo.InvariantCulture)) 
    .ToArray(); 

    // finally, if you need it 
    int x = args[0]; 
    int y = args[1]; 
    int z = args[2]; 
+0

Спасибо за ваш ответ, но, к сожалению, мне просто нужно разобрать целые числа от символов, beacuse у меня есть рабочая программа на этом, и это единственная проблема, которую мне нужно решить, и я думаю, что регулярное выражение является правильным ответом для этого. – anthraxa

+0

@anthraxa: если вы хотите анализировать только целые числа, например. для '' (100, 18, -125) «вы хотите, чтобы' '[100, 18, -125]' регулярные выражения перерегулировались, и это можно сделать только с помощью «Split» (см. мое редактирование) –

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