aLearningGeekGal Ответов: 3

Есть ли лучший способ и могу ли я ускорить его? (Файл dat без разделителей в виде сетки)


Я новичок в C#, но не программирую. Мне было предложено прочитать в файле .dat, который имеет определенную длину записи, но не имеет конца записи или разделителей полей. Файл не будет редактироваться, но должен быть отсортирован по каждому полю. Файл загружается при открытии формы, поэтому это первое, что видит пользователь.

Что я уже пробовал:

I chose to try the datagrid view.   Also, I've never made a datagrid view before.  I opted to play with the dat file using a sub-string initially.

First, I read the sub-strings into a record array, then tried to add the array with a loop.  This works beautifully - for the first record.  When I loop, I get nothing but a nice heavy bit of processing.

Next, I created a CSV separated line using the substrings, then split it to add to the table.  Same thing. Works great for first record - loop and more than 4 minutes pass (approx. 1500 records in dat file)

Should I approach it with a data connection? and if so, could you provide me with a link to where I can research it? I learn better by doing and playing with examples :)


private void Form1_Load(object sender, EventArgs e)
       {
           string inFile = "OH-PSF.DAT";

           //string[] record = new string[2000];
           string strLine;
           using (System.IO.StreamReader sr = new System.IO.StreamReader(inFile))
           {
               string filetext = sr.ReadToEnd(); //read in the file

               //int rowCount = 0;
               for (int x = 0; x < filetext.Length; x++)
               {
              // while (x < 600) {

                   string data1 = filetext.Substring(x, 9); x = 9;//next=index where next ss should start
                   string data2 = filetext.Substring(x, 10); x = x + 10; //10=currently read field size
                   string data3 = filetext.Substring(x, 2); x = x + 2;
                   string data4 = filetext.Substring(x, 28); x = x + 28;
                   string data5 = filetext.Substring(x, 20); x = x + 20;
                   string data6 = filetext.Substring(x, 2); x = x + 2;
                   string data7 = filetext.Substring(x, 20); x = x + 20;
                   string data8 = filetext.Substring(x, 6); x = x + 6;
                   string data9 = filetext.Substring(x, 7); x = x + 7;
                   strLine= data1 + "," + data2 + "," + data3 + "," + data4 + "," + data5 + "," + data6 + "," + data7 + "," + data8 + "," + data9;
                   string[] strArray = strLine.Split(',');
                   strArray = strLine.Split(',');
                   dataGridView1.Rows.Add(strArray);


                   //dataGridView1.Rows.Add(record[0], record[1], record[2], record[3], record[4], record[5], record[6], record[7], record[8]);
               }


           }


       }//ends form 1 load

3 Ответов

Рейтинг:
4

aLearningGeekGal

Огромное спасибо.. Я чувствую себя глупо. Длина записи была 104, и я только увеличивал петлю на 1. Это была проблема 1. Разбиение строки с разделителями было проблемой, но единственное, что действительно исправлено, - это создание таблицы данных, которую я не понимал, что мне нужно делать :) Спасибо! Я многому научился!

DataTable dt = new DataTable();
DataColumn dc = new DataColumn("data", typeof(string));
dt.Columns.Add("1");
dt.Columns.Add("2");
dt.Columns.Add("3");
dt.Columns.Add("4");
dt.Columns.Add("5");
dt.Columns.Add("6");
dt.Columns.Add("7");
dt.Columns.Add("8");
dt.Columns.Add("9");

ArrayList recordList = new ArrayList();

    using (System.IO.StreamReader sr = new System.IO.StreamReader(inFile))
    {
        string filetext = sr.ReadToEnd(); //read in the file


   for (int y = 0; y < filetext.Length; y+=104) //record length is 104 *facepalm* took 2 hours to figure this out!!
    {



        string[] strArray = new string[9];


        strArray[0] = filetext.Substring(x, 9); x = 9;//next=index where next ss should start
        strArray[1] = filetext.Substring(x, 10); x = x + 10; //10=currently read field size
        strArray[2] = filetext.Substring(x, 2); x = x + 2;
        strArray[3] = filetext.Substring(x, 28); x = x + 28;
        strArray[4] = filetext.Substring(x, 20); x = x + 20;
        strArray[5] = filetext.Substring(x, 2); x = x + 2;
        strArray[6] = filetext.Substring(x, 20); x = x + 20;
        strArray[7] = filetext.Substring(x, 6); x = x + 6;
        strArray[8] = filetext.Substring(x, 7); x = x + 7;
        recordList.Add(strArray);

        dt.Rows.Add(strArray);
    }
    dataGridView1.DataSource = dt;


OriginalGriff

Я бы сделал это - и вы можете игнорировать это, если хотите, - создав класс, содержащий строковые свойства для каждого поля и имеющий конструктор, который принимает входные данные и начальное смещение. Конструктор заполняет строки, а затем ваш основной код создает список экземпляров класса. Вы можете использовать список непосредственно в качестве источника данных, и имена свойств автоматически станут именами столбцов в вашем DGV.

Рейтинг:
20

OriginalGriff

Есть пара вещей.
1) Не добавляйте строки в DGV одну за другой - добавьте их все в конце с помощью функции with AddRange. Добавление их один за другим обновляет элемент управления дисплеем каждый раз, и это происходит медленно.
2) Посмотрите на свой код.

strLine= data1 + "," + data2 + "," + data3 + "," + data4 + "," + data5 + "," + data6 + "," + data7 + "," + data8 + "," + data9;
string[] strArray = strLine.Split(',');
strArray = strLine.Split(',');
Почему?
Возьмите отдельные значения - все строки - соберите их в одну строку с добавленным разделителем, а затем разделите ее на отдельные строки на основе только что добавленного разделителя ... Кажется ли вам, что это разумный способ делать вещи?