парсинг

Программирование на Юнити.

парсинг

Сообщение djon801 11 янв 2019, 16:34

Всем добра! Подскажите пожалуйста. каким образом можно считать координаты с .txt файла? суть вот в чём заключается. Есть огромный список в виде .txt
Синтаксис:
Используется csharp
(1258.0, 650.0, 0.0)
(1194.0, 616.0, 0.0)
(1122.0, 597.0, 0.0)
(1054.0, 634.0, 0.0)
(993.0, 673.0, 0.0)
(917.0, 684.0, 0.0)
(852.0, 650.0, 0.0)
(797.0, 605.0, 0.0)
(751.0, 558.0, 0.0)
(722.0, 506.0, 0.0)
(780.0, 469.0, 0.0)

ну допустим я смог это считать в лист или допустим набить массив. Но только в string
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Text;

public class logic : MonoBehaviour
{
   
    public List<string> myArr = new List<string>();
    public GameObject obj;

    void Start()
    {
        myArr.AddRange(File.ReadAllLines(@"C:\\Users\\999\\Documents\\Test\\Assets\\TestFile.txt", System.Text.Encoding.GetEncoding(1251)));
        for (int i = 0; i < myArr.Count; i++)
        {      
            Instantiate(obj, new Vector3(????), Quaternion.identity);
        }
    }
}

теперь мне надо по этим координатам раскидать объекты. Я понимаю что надо парсить string в int. Но как скормить целиком строку в Instantiate(obj, new Vector3(????). или я не правильно подхожу к этому делу? Объясните пожалуйста. Спасибо
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: парсинг

Сообщение 1max1 11 янв 2019, 16:56

Если строки всегда по такому шаблону, то распарсить несложно:
Синтаксис:
Используется csharp
static Vector3 GetVector3OfString(string str)
{
    var c = (CultureInfo)CultureInfo.CurrentCulture.Clone();
    c.NumberFormat.NumberDecimalSeparator = ".";
    var v = str.Replace("(", "").Replace(")", "").Replace(",", "").Split(' ');
    return new Vector3(float.Parse(v[0], c), float.Parse(v[1], c), float.Parse(v[2], c));
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: парсинг

Сообщение djon801 11 янв 2019, 17:08

Сейчас опробую)) но пока не разберусь что к чему. Сейчас сам голову поломаю.
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: парсинг

Сообщение 1max1 11 янв 2019, 17:13

Там только вопрос с культурой наверное неясен, ответ тут - https://stackoverflow.com/questions/277 ... rse-string
Если бы числа были целыми, было бы легче))
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: парсинг

Сообщение djon801 11 янв 2019, 17:14

не доходит
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: парсинг

Сообщение djon801 11 янв 2019, 17:46

1max1 до меня реально не доходит как это всё собрать воидино, не затруднит чутка по подробнее разжевать бестолучу)))
на эту строку вотreturn new Vector3(float.Parse(v[0], c), float.Parse(v[1], c), float.Parse(v[2], c)); такие жалобы.
IndexOutOfRangeException: Array index is out of range.
logic.GetVector3OfString (System.String str) (at Assets/scripts/logic.cs:29)
logic.Start () (at Assets/scripts/logic.cs:19)
массив в не диапозона.
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: парсинг

Сообщение 1max1 11 янв 2019, 18:12

Синтаксис:
Используется csharp
// Это нужно для того чтобы правильно распарсить число с плавающей точкой, если у тебя разделитель будет точка (а он у тебя точка), а культура будет установлена ru-RU, то метод float.Parse вернет екскепшн, типа неправильный формат, потому что в культуре ru-RU разделителем является запятая.

var c = (CultureInfo)CultureInfo.CurrentCulture.Clone();
c.NumberFormat.NumberDecimalSeparator = ".";

// Ну я думаю ты знаешь, что делает метод Replace)) (заменяет одну строку на другую).
// Здесь я просто убираю из строки скобки "(" и ")", заменяя их на пустую строку "", тоже самое и с запятыми.
// После этого строка из "(1258.0, 650.0, 0.0)" преобразуется в "1258.0 650.0 0.0".
// Теперь с помощью метода Split разделяется целая строка на подстроки, и засовывается в массив,
// в качестве разделителя выступает пробел.
// v[0] == 1258.0
// v[1] == 650.0
// v[2] == 0.0

var v = str.Replace("(", "").Replace(")", "").Replace(",", "").Split(' ');

// Ну а дальше отдельно парсим каждый элемент массива и пихаем в вектор уже готовое число.

return new Vector3(float.Parse(v[0], c), float.Parse(v[1], c), float.Parse(v[2], c));
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: парсинг

Сообщение djon801 11 янв 2019, 21:01

ну в принципе принцип понятен. Но вот только осталось понять как отчищать массив V[] при входе нового индекса. и чёт не пойму как передать из return new Vector3 в переменную Vector3. Или я опять не там ковыряюсь?
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: парсинг

Сообщение 1max1 11 янв 2019, 21:16

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

Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: парсинг

Сообщение djon801 11 янв 2019, 21:27

Синтаксис:
Используется csharp
(0,0,0)
(1258.0, 650.0, 0.0)
(1194.0, 616.0, 0.0)
(1122.0, 597.0, 0.0)
(1054.0, 634.0, 0.0)
(993.0, 673.0, 0.0)
(917.0, 684.0, 0.0)
(852.0, 650.0, 0.0)
(797.0, 605.0, 0.0)
(751.0, 558.0, 0.0)
(722.0, 506.0, 0.0)
(780.0, 469.0, 0.0)
(860.0, 449.0, 0.0)
(940.0, 456.0, 0.0)
(1014.0, 477.0, 0.0)
(1088.0, 505.0, 0.0)
(1166.0, 530.0, 0.0)
(1240.0, 546.0, 0.0)
(1276.0, 494.0, 0.0)
(1302.0, 437.0, 0.0)
(1294.0, 382.0, 0.0)
(1216.0, 358.0, 0.0)
(1138.0, 340.0, 0.0)
(1053.0, 349.0, 0.0)
(966.0, 347.0, 0.0)
(898.0, 310.0, 0.0)
(905.0, 253.0, 0.0)
(983.0, 235.0, 0.0)
(1068.0, 237.0, 0.0)
(1151.0, 248.0, 0.0)
(1224.0, 218.0, 0.0)
(1201.0, 164.0, 0.0)
(1145.0, 121.0, 0.0)
(1073.0, 93.0, 0.0)
(989.0, 95.0, 0.0)
(905.0, 114.0, 0.0)
(824.0, 103.0, 0.0)
(741.0, 88.0, 0.0)
(659.0, 76.0, 0.0)
(575.0, 74.0, 0.0)
(544.0, 126.0, 0.0)
(601.0, 168.0, 0.0)
(650.0, 215.0, 0.0)
(696.0, 262.0, 0.0)
(691.0, 319.0, 0.0)
(614.0, 339.0, 0.0)
(532.0, 322.0, 0.0)
(482.0, 277.0, 0.0)
(433.0, 229.0, 0.0)
(395.0, 177.0, 0.0)
(358.0, 127.0, 0.0)
(305.0, 83.0, 0.0)
(225.0, 67.0, 0.0)
(154.0, 96.0, 0.0)
(175.0, 155.0, 0.0)
(214.0, 204.0, 0.0)
(209.0, 260.0, 0.0)
(172.0, 315.0, 0.0)
(145.0, 366.0, 0.0)
(191.0, 415.0, 0.0)
(274.0, 417.0, 0.0)
(361.0, 424.0, 0.0)
(438.0, 444.0, 0.0)
(509.0, 472.0, 0.0)
(570.0, 509.0, 0.0)
(601.0, 562.0, 0.0)
(630.0, 616.0, 0.0)
(558.0, 650.0, 0.0)
(474.0, 649.0, 0.0)
(409.0, 613.0, 0.0)
(352.0, 571.0, 0.0)
(289.0, 527.0, 0.0)
(205.0, 520.0, 0.0)
(169.0, 567.0, 0.0)
(120.0, 617.0, 0.0)
 

дело в том что он будет меняться иногда,но структура всегда будет такая
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: парсинг

Сообщение 1max1 11 янв 2019, 21:31

(0,0,0) замени на (0.0, 0.0, 0.0)

Либо поменяй метод на этот:
Синтаксис:
Используется csharp
Vector3 GetVector3OfString(string str)
{
    var c = (CultureInfo)CultureInfo.CurrentCulture.Clone();
    c.NumberFormat.NumberDecimalSeparator = ".";
    var v = str.Replace("(", "").Replace(")", "").Replace(" ", "").Split(',');
    return new Vector3(float.Parse(v[0], c), float.Parse(v[1], c), float.Parse(v[2], c));
}
 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: парсинг

Сообщение djon801 11 янв 2019, 21:35

хоть застрелись индекс вне диапазона
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Text;
using System.Globalization;

public class logic : MonoBehaviour
{

    public List<string> myArr = new List<string>();
    public GameObject obj;
    void Start()
    {
       
        myArr.AddRange(File.ReadAllLines(@"C:\\Users\\999\\Documents\\test\\Assets\\TestFile.txt", System.Text.Encoding.GetEncoding(1251)));
       
        for (int i = 0; i < myArr.Count; i++)
        {
 
            Instantiate(obj, GetVector3OfString(myArr[i]), Quaternion.identity);
        }
       
    }
    Vector3 GetVector3OfString(string str)
    {
        var c = (CultureInfo)CultureInfo.CurrentCulture.Clone();
        c.NumberFormat.NumberDecimalSeparator = ".";
        var v = str.Replace("(", "").Replace(")", "").Replace(",", "").Split(' ');
        return new Vector3(float.Parse(v[0], c), float.Parse(v[1], c), float.Parse(v[2], c));
       
    }

}
 

может где ошибка? у меня уже в глазах рябит
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

Re: парсинг

Сообщение 1max1 11 янв 2019, 21:37

¯ \ _ (ツ) _ / ¯
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: парсинг

Сообщение Saltant 11 янв 2019, 21:44

А что посмотреть варианты в Debug.Log() уже не модно?
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: парсинг

Сообщение djon801 11 янв 2019, 21:47

1max1 писал(а):¯ \ _ (ツ) _ / ¯

[curved_hands] (0,0,0)
Спасибо мил человек! (3A4OT) я пойду напьюсь)))))))))
Последний раз редактировалось djon801 11 янв 2019, 21:52, всего редактировалось 1 раз.
Аватара пользователя
djon801
Старожил
 
Сообщения: 506
Зарегистрирован: 03 май 2014, 15:08

След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6