1

Есть задача считать из файла .csv данные, разделенные точкой с запятой ';', в массив String^.
Количество строк и столбцов известно, массив создаю динамически. В массиве столько же строк и столбцов сколько и в файле. То есть должен вписаться идеально.

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
setlocale(LC_ALL,"Russian");

array<String^,2>^ basedfs;
array<String^,2>^ basehw;
basedfs=gcnew array<String^,2>(stringsdfs,lenghtdfs);//первый массив, размерность определена в этих переменных.
basehw=gcnew array<String^,2>(stringshw,lenghthw);//второй
try 
{
    StreamReader^ dfs=gcnew StreamReader("MSV-BD1.csv");//файл,из которого читаю данные
    for (int i=0;i<stringsdfs;i++){
        for(int j=0;j<lenghtdfs;j++){
            basedfs[i,j]=Convert::ToString(dfs->ReadLine()->Split(';'));//пытаюсь засплитить через точку с запятой
        }
    }
    delete dfs;
}
catch (...)
{
    textBox1->Text="Файл не может быть открыт";

}
textBox2->Text=basedfs[3,7];//но здесь выводит System.String[]. 

}

Как считать данные?

Kromster
  • 13,809
anonim
  • 13
  • CSV означает "comma-separated values", а у вас точка с запятой. Это раз. Затем, есть ли какой-то escaping? В настоящем CSV можно строку заключить в кавычки, и в ней запятая не имеет особого смысла — а у вас? – VladD Jul 17 '15 at 13:40
  • Есть таблица в Excel. При сохранение указываю тип файлы CSV (разделители - запятые). При открытии блокнотом данные таблицы разделены ';'. Не знаю почему. В обычном С++(в консоли) все реализовалось достаточно просто. ТЕперь требуется графическая оболочка - возникли проблемы – anonim Jul 17 '15 at 13:52
  • В России разделяется точкой с запятой. Запятая занята под вещественные числа. – pavelip Jul 17 '15 at 14:04
  • @pavelip: Формат даже в Африке формат. Представьте себе, что в России внутри JPEG-файлов все символы «,» надо было бы понимать как «.». – VladD Jul 17 '15 at 14:45
  • @valentinn: Разница между C++ тем, что вы пишете, огромна! Вы пишете не на C++, а на отвратительном монстре C++/CLI. Если уж пишете на .NET, переходите на C#, иначе проблемы будут на каждом шагу. – VladD Jul 17 '15 at 14:47
  • @VladD Да, я же не спорю. Часто пользователи такие файлы делают в excel и их нужно читать. "Для русифицированного Microsoft Excel (в системах, на которых разделителем списка установлена точка с запятой) исходный текст будет выглядеть так..." https://ru.wikipedia.org/wiki/CSV – pavelip Jul 17 '15 at 14:48
  • @pavelip: Ох :-( У Word'а очень вольная трактовка формата. – VladD Jul 17 '15 at 14:53
  • @VladD , На С# я не умею, к сожалению =) Можно какой нибудь совет с какой книги можно начать изучать .NET C#. Вроде опыт программирования есть, но на самом начальном уровне. Весь институт на С++ =) – anonim Jul 20 '15 at 07:26
  • @valentinn: Поверьте, вы не умеете и на C++/CLI. Синтаксиса наподобие String^ или там for each в чистом C++ нету. По поводу C#, вот канонический список. – VladD Jul 20 '15 at 07:46
  • @VladD, не сомневаюсь =))) Спасибо Вам большое=) – anonim Jul 20 '15 at 09:02
  • @valentinn: Пожалуйста! Чем скорее вы слезете с C++/CLI, и пересядете либо на чистый C++, либо на C#, тем лучше — поверьте. – VladD Jul 20 '15 at 09:03
  • @VladD, а как программировать с графическим интерфейсом на чистом С++? Точнее, не как, а где?) – anonim Jul 20 '15 at 09:09
  • @valentinn: Существует несколько графических фреймворков под C++. Например, Qt. Или WinAPI/MFC. Но один из них в любом случае придётся выучить, это не вопрос пяти минут. – VladD Jul 20 '15 at 09:22
  • @VladD, то есть на платформе Qt можно писать приложения с элементами графического интерфейса но только на языке С++? Но он ведь все равно будет как то отличаться от того, на котором я например пишу в visual studio в консольном приложении Windows – anonim Jul 20 '15 at 09:52
  • @valentinn: Ну, Qt — это прежде всего фреймворк для C++. Да, в нём вполне можно писать графические приложения. И да, это будет отличаться от приложений командной строки (event loop, обработка событий и всё такое), так что придётся выучить. Но здесь уже учить не новый язык, а просто набор C++-объектов фреймворка. Ну или то же самое в C# с фреймворками типа WinForms (то, на чём вы пишете сейчас под C++/CLI) или WPF (более новый и продвинутый фреймворк). – VladD Jul 20 '15 at 09:59
  • @valentinn: в принципе, вы можете разрабатывать приложения под Qt и из-под Visual Studio. – VladD Jul 20 '15 at 10:00
  • @VladD, а Вы не может подсказать почему в Microsoft Visual Studio 2010 у элемента textBox нет события KeyPress, и я не могу ограничить ввод только цифр и запятой) – anonim Jul 20 '15 at 10:34
  • Вы имеете в виду C++/CLI + WInForms? Потому что Visual Studio — это только редактор текста + отладчик. // А какого типа textBox? – VladD Jul 20 '15 at 10:38
  • да. просто забыл написать. или легче же использовать numericupdown. Но тогда придется конвертировать значения в String^, ведь у меня массив String^. //или же там можно как то чтобы он как текст считал. Вроде свойство Text есть – anonim Jul 20 '15 at 10:40

1 Answers1

1
using namespace System;
using namespace System::IO;
using namespace System::Collections::Generic;

List<array<String^>^>^ list = gcnew List<array<String^>^>();
for each (String^ line in File::ReadLines("MSV-BD1.csv"))
{
    list->Add(line->Split(';'));
}

array<String^>^ row = list[0]; // берем строку 0
String^ cell = row[0];         // берем ячейку 0

// количество элементов в строке
int length = row->Length;

// одной командой
String^ cell = dynamic_cast<array<String^>^>(list[0])[0];

//Печать в консоль
for each (array<String^>^ row in list)
{
    for (int i = 0; i < row->Length; i++)
    {
        String^ cell = row[i];
        Console::Write(cell + "\t");
    }
    Console::WriteLine();
}
pavelip
  • 5,670
  • Спасибо, а как мне потом обращаться к этим данным? Мне потом по ходу программы требуется сравнивать их, искать и тд. Ну то есть, с массивом я представлял как, по индексам циклом проходишь. А как здесь? – anonim Jul 17 '15 at 13:49
  • Добавил доступ к массивам – pavelip Jul 17 '15 at 14:13
  • Еще раз спасибо. Можно пару вопросов: 1.Как я понял из Гугла List это сам динамчески расширяющийся список? То есть мне не требуются пляски с бубном чтобы узнать сколько у меня строк и элементов с троке в файле? 2.Вы объявили его, получается, как список массивов? а какой длины? Это он типа сам решит? 3. То что Вы добавили: массив row = это массив с элементами list[0]? String^ cell=row[0] - а вот что это, совсем не понял. Это индекс элемента первого массива? Или как? – anonim Jul 17 '15 at 14:20
  • Да, List динамический, но отвечает за строки. 2. Как список указателей на массив указателей на строку. 3. Вначале получаем 0 строку, потом из нее получаем 0 колонку.
  • – pavelip Jul 17 '15 at 14:25
  • Как это сложно для восприятия:список указателей на массив указателей на строку ))) Это работает, не то что мой) А как мне теперь можно работать с данной структурой. Пробежаться например по всем элементам, и найти нужный? получается нужно создать столько массивов, сколько строк в файле.и столько же переменных, сколько элементов в строке – anonim Jul 17 '15 at 14:33
  • "столько массивов, сколько строк в файле.и столько же переменных, сколько элементов в строке" - не нужно. Два вложенных цикла просто. Добавил пример обхода. – pavelip Jul 17 '15 at 14:40