Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: CSV памагити

  1. #1

    По умолчанию CSV памагити

    Добрый день!
    мне не дано пользоваться поиском по форуму, подскажите наверняка есть нормальные примеры конвертации в CSV (юникод) обычных real word и других данных
    с переводами строк и символом окончания

    я пока пользуюсь
    REAL_TO_WSTRING и StrConcatW
    И все бы ничего, только не знаю как закончить файл, в конце какая-то фигня все время.
    Ну и может есть более изящные примеры.

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,165

    По умолчанию

    Добрый день.

    И все бы ничего, только не знаю как закончить файл, в конце какая-то фигня все время.
    Опишите, пожалуйста, проблему так, чтобы я и другие пользователи смогли ее понять.
    Выложите ваш проект, с которым можно воспроизвести проблему.

  3. #3

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Опишите, пожалуйста, проблему так, чтобы я и другие пользователи смогли ее понять.
    Выложите ваш проект, с которым можно воспроизвести проблему.
    Проект слишком большой чтобы его выкладывать, в нем еще капаться придется.
    Могу выложить функцию преобразования и результат.

    Код:
    FUNCTION_BLOCK create_csv_file
    VAR_INPUT
    	made: BOOL;
    	file_data: POINTER TO struct_bin_file_record;
    END_VAR
    VAR_OUTPUT
    	done: BOOL;
    	csv_result: WSTRING(10000);
    END_VAR
    VAR
    	t_state: INT;
    	run: R_TRIG;
    	i: INT;
    	t_wstring: WSTRING;
    END_VAR
    VAR CONSTANT
    	devider: WSTRING := ",";
    	new_liner: WSTRING := "$N";
    	ender: WSTRING := "$P";
    END_VAR
    
    run(CLK:=made);
    
    CASE t_state OF
    	
    	0: //======================================= wait for execute =====
    		IF run.Q THEN
    			t_state := 1;
    			done := FALSE;
    			csv_result := STRING_TO_WSTRING('Перемещение,Давление,Усилие$N');
    		END_IF
    
    		
    	1: //======================================= create file =====
    		FOR i:=0 TO file_data^.table_point DO
    			t_wstring := REAL_TO_WSTRING(file_data^.table[i].len);
    			StrConcatW ( ADR(t_wstring) , ADR(csv_result) , SIZEOF(csv_result) );
    			StrConcatW ( ADR(devider) , ADR(csv_result) , SIZEOF(csv_result) );
    			
    			t_wstring := REAL_TO_WSTRING(file_data^.table[i].pres);
    			StrConcatW ( ADR(t_wstring) , ADR(csv_result) , SIZEOF(csv_result) );
    			StrConcatW ( ADR(devider) , ADR(csv_result) , SIZEOF(csv_result) );
    			
    			t_wstring := REAL_TO_WSTRING(file_data^.table[i].force);
    			StrConcatW ( ADR(t_wstring) , ADR(csv_result) , SIZEOF(csv_result) );
    			StrConcatW ( ADR(devider) , ADR(csv_result) , SIZEOF(csv_result) );
    			
    			StrConcatW ( ADR(new_liner) , ADR(csv_result) , SIZEOF(csv_result) );
    		END_FOR
    		t_state := 2;
    
    
    	2: //======================================= write to buffer =====
    		t_wstring := " , , ,$N";
    		StrConcatW ( ADR(t_wstring) , ADR(csv_result) , SIZEOF(csv_result) );
    		
    		t_wstring := REAL_TO_WSTRING(file_data^.result_Lenght);
    		StrConcatW ( ADR(t_wstring) , ADR(csv_result) , SIZEOF(csv_result) );
    		StrConcatW ( ADR(devider) , ADR(csv_result) , SIZEOF(csv_result) );
    			
    		t_wstring := REAL_TO_WSTRING(file_data^.result_Preasure);
    		StrConcatW ( ADR(t_wstring) , ADR(csv_result) , SIZEOF(csv_result) );
    		StrConcatW ( ADR(devider) , ADR(csv_result) , SIZEOF(csv_result) );
    			
    		t_wstring := REAL_TO_WSTRING(file_data^.result_Force);
    		StrConcatW ( ADR(t_wstring) , ADR(csv_result) , SIZEOF(csv_result) );
    		StrConcatW ( ADR(devider) , ADR(csv_result) , SIZEOF(csv_result) );
    		
    		StrConcatW ( ADR(ender) , ADR(csv_result) , SIZEOF(csv_result) );
    		
    		done := TRUE;
    		t_state := 0;
    
    END_CASE
    результат всего этого в переменной в кодесисе вот такой:
    ууу.png
    а в экселе вот такой
    kkk.png

    Проблема в том что он что-то лишнее в конце добавляет.
    Гипотетически это конечно может делать функция записи в файл, но другие файлы она ок записывает......
    И еще проблема в том, что полученный фал открывает эксель, а ворд, блокнот и другие не открывают.
    Вот может подскажете нужное преобразование, а не стринг_встринг.
    Последний раз редактировалось Raikkonen; 06.12.2021 в 13:19.

  4. #4

  5. #5

    По умолчанию

    Спасибо! А нет идей почему в конце какая-то гадость приклеивается?

  6. #6

  7. #7

    По умолчанию

    вот тот блок формирует wstring(10000)
    а потом вот таким кодом она записывается за один раз

    fbFileWrite(xExecute:=TRUE, hFile:=hBinFile, pBuffer:=file_data, szSize:=SIZEOF(file_data^));

    это экземпляр FILE.Write
    после этого делаю Flush
    пишу на USB-флешку

    обработчик вроде нормально написал. жду когда у него будет Done

  8. #8

    По умолчанию

    Благодаря предыдущим двум ссылкам файлик открывается теперь хоть вордом хоть блокнотом хоть экселем, спасибо большое!
    и real стали контролируемыми
    Осталось победить кракозябру в конце

  9. #9
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,165

    По умолчанию

    А зачем записывать в файл все 20002 байта буфера?
    Фактически же ваш набор строк занимает гораздо меньше.

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

  10. #10

    По умолчанию

    а я б с радостью.
    руками считать количество символов?
    а нет возможности этому csv_result: WSTRING(10000); задать каким-то чудесным символом конец строки?


    ВОВОВО а как приклеить терминирующий ноль?
    это все равно руками считать количество символов и после них приклеить 16#0000 ?

    руками сложновато считать количество символов из-за того что у меня есть числа, их длинна варьируется.
    Это перед каждой проверкой еще смотреть длинну..... может существуют более изящные решения?
    Последний раз редактировалось Raikkonen; 06.12.2021 в 14:05.

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •