Как писать параметры csv=файла в отдельные ячейки?

 

Пишу лог-файл функцией, которую допиливаю по свои нужды. На данный момент, она такая:

void writeLog(string dataToWrite,                      // Данные, которые требуется записать в log-файл
              bool   needLogging = false,              // Флаг необходимости вывода лога в журнал и(или) на экран терминала
              bool   needPrinting = false) export {    // Флаг печати комментариев
//----
  string terminalDataPath = TerminalInfoString(TERMINAL_DATA_PATH);
  string subfolder = MQLInfoString(MQL_PROGRAM_NAME);

  datetime curDayOpenTime = getBarOpenTime(0, _Symbol, PERIOD_D1);
//  string   subfolder = __FILE__;
  string   fileName = subfolder + "\\" + TimeToString(curDayOpenTime, TIME_DATE) + ".csv";
//  int f=       FileOpen(fileName,FILE_READ|FILE_WRITE|FILE_SHARE_READ|FILE_CSV|FILE_UNICODE|(COMMON?FILE_COMMON:0),';',CP_UTF8);
  int handle = FileOpen(fileName, FILE_READ|FILE_WRITE|FILE_CSV, ";");
  FileSeek(handle, 0, SEEK_END);
//  FileWrite(handle, TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS), " : ", dataToWrite);
  FileWrite(handle, TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS), dataToWrite);
  FileClose(handle);
}

Зачем писать в эксель, если все параметры пишутся в одну ячейку(клетку). Что бы писались в разные клетки нельзя что-ли?

 

Да ты же сам говоришь, что файл csv - "comma-separated values" !

Этот файл как раз и предназначен для того, чтобы писать в разные ячейки.

У меня, скажем есть специальный класс CStringMatrix - матрица строк, который я заполняю в програме, и который умеет, если надо - писать в этот файл, просто ставя разделители.

 

Кстати, вопрос присутствующим - как из программы выяснить установку "Разделитель элементов списка" из региональных настроек ?

(Именно этот разделитель используется при анализе CSV-файлов в Excel'e)


 
hoz:

Пишу лог-файл функцией, которую допиливаю по свои нужды. На данный момент, она такая:

Зачем писать в эксель, если все параметры пишутся в одну ячейку(клетку). Что бы писались в разные клетки нельзя что-ли?

Можно. Просто надо писать несколько раз.

  int handle = FileOpen(fileName, FILE_READ|FILE_WRITE|FILE_CSV, ";");
  FileSeek(handle, 0, SEEK_END);
  FileWrite(handle, TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS));
  FileWrite(handle, dataToWrite);
  FileClose(handle);
Так будет заполнено две ячейки одной строки Excell
 
Georgiy Merts:

Кстати, вопрос присутствующим - как из программы выяснить установку "Разделитель элементов списка" из региональных настроек ?

(Именно этот разделитель используется при анализе CSV-файлов в Excel'e)

По-моему, в MQL такого нет. Поэтому путь один - GetLocaleInfo из kernel32.dll.

 
Ihor Herasko:

По-моему, в MQL такого нет.

Вот и у меня такое подозрение...

Не хочется использовать DLL, даже системные... И не хочется озадачивать пользователя вводом разделителя... 

 
Alexey Viktorov:

Можно. Просто надо писать несколько раз.

Так будет заполнено две ячейки одной строки Excell

Мда, после нормальный джавовских фреймворков, это как-то скудно)) По сути, не важно. Можно разделитель поставить, а потом когда открывать, то указывать разделитель. И всё расставляется по разным ячейкам.

Georgiy Merts:

Вот и у меня такое подозрение...

Не хочется использовать DLL, даже системные... И не хочется озадачивать пользователя вводом разделителя... 

А пользователю то это зачем? Если лог-файл, то это себе нужно, а не пользователю.. Пользователь, навряд ли, в файл полезет. Ему проще на экран вывесит что-то в окошко.

 
hoz:
 

А пользователю то это зачем? Если лог-файл, то это себе нужно, а не пользователю.. Пользователь, навряд ли, в файл полезет. Ему проще на экран вывесит что-то в окошко.

Да если бы только мне - и вопросов бы не было.

"На экран вывесить в окошко" - совсем не проще. Экселевская таблица - куда более удобна, и график можно построить, и вычисления провести.

Просто  столкнулся с тем, что у пользователя буржуйская Винда, и, соответственно, эксель открывает файл, не разделяя его на ячейки. Разобрать-то разобрались, заменили разделитель - все заработало. Но предпочтительнее, чтобы CSV-разделитель ставился бы автоматически правильно.

 
Georgiy Merts:

Да если бы только мне - и вопросов бы не было.

"На экран вывесить в окошко" - совсем не проще. Экселевская таблица - куда более удобна, и график можно построить, и вычисления провести.

Просто  столкнулся с тем, что у пользователя буржуйская Винда, и, соответственно, эксель открывает файл, не разделяя его на ячейки. Разобрать-то разобрались, заменили разделитель - все заработало. Но предпочтительнее, чтобы CSV-разделитель ставился бы автоматически правильно.

Вот здесь предлагалось решение с помощью макроса открытия текстового файла в Excel,

https://social.technet.microsoft.com/Forums/ru-RU/995a5be0-a0db-4229-89c0-9236f8ef8910/-txt-?forum=xpru

только не всем оно подходит:

"Спасибо за макрос, но использовать его мы не можем из-за того, что мы используем сертификаты безопасности с цифровой подписью(((. Видимо единственно возможный выход - это использовать файлы csv. Эксель настроить пока не удалось((("

Как открыть txt файл в виде таблицы эксель, если разделителем является точка с запятой
  • social.technet.microsoft.com
Спасибо, но это не помогло. Микрософт считает, что "TXT-файлы - Это файлы с разделителями в виде знаков табуляции. Каждый столбец обычно отделяется одним знаком табуляции." Дело в том, что файл, который создают пользователи - текстовый с разделителем ТОЧКА С ЗАПЯТОЙ, а не с табуляцией. Иначе все было бы просто. Вопрос, наверное уже в том - как...
 
Vladimir:

Вот здесь предлагалось решение с помощью макроса открытия текстового файла в Excel,

Спасибо, но предлагать пользователям ставить макрос - ничуть не проще, чем предложить изменить разделитель в региональных установках.

То есть, раз выяснить это из МКЛ-скрипта нельзя - то проще всего просить пользователей заменять разделитель.

В остальном - все в порядке, все нормально работает, и нормально открывается.

Вот же, все графики и таблицы из моей Лиги Торговых Систем - сделаны как раз этим скриптом. 

 

Чтоб не спорили
Причина обращения: