Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Office Новый топик    Ответить
 Конвертировать файл .vcs  [new]
Павловский Юрий
Member

Откуда:
Сообщений: 13
Здравствуйте!

Столкнулся с проблемой. Из телефона вытащил данные календаря в формате vCalendar(*.vcs).
На каждое событие календаря свой файл
содержание следующее

BEGIN:VCALENDAR
VERSION:1.0
BEGIN:VEVENT
DTSTART:20071130T000000Z
DTEND:20071130T000000Z
AALARM:20071130T070000Z;;0;
X-EPOCAGENDAENTRYTYPE:ANNIVERSARY
X-BIRTHYEAR:2007
SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:=D0=90=D0=BB=D0=B5=D0=BD=
=D1=8B=D0=BD =D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9
RRULE:YM1 11 #0
END:VEVENT
END:VCALENDAR


необходимо из этих файлов получить один csv файл
конвертера подходящего так и не нашел. Если какие и работают, то не тянут все поля. например поле X-BIRTHYEAR

Конечная цель, это импортировать данные о днях рождения на смарт с андроидом 4.х
Что-то штатными средствами как-то не все получается.

Спасибо заранее.
16 мар 14, 00:48    [15731592]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 17511
а пример результирующего csv можно?
16 мар 14, 01:18    [15731726]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Павловский Юрий
Member

Откуда:
Сообщений: 13
ну вот примерно такой

К сообщению приложен файл (пример.csv - 988bytes) cкачать
16 мар 14, 01:43    [15731803]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 17511
Может еще опишете, как вы из этого
Павловский Юрий
BEGIN:VCALENDAR
VERSION:1.0
BEGIN:VEVENT
DTSTART:20071130T000000Z
DTEND:20071130T000000Z
AALARM:20071130T070000Z;;0;
X-EPOCAGENDAENTRYTYPE:ANNIVERSARY
X-BIRTHYEAR:2007
SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:=D0=90=D0=BB=D0=B5=D0=BD=
=D1=8B=D0=BD =D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9
RRULE:YM1 11 #0
END:VEVENT
END:VCALENDAR
получаете вот это:
Павловский Юрий
Валя Борыка,,"05.02.2010 2:00:00","05.02.2010 2:00:00",,,,,"Public","30.12.1899 2:00:00","0",,

а то как-то недосуг читать документацию по обоим форматам
16 мар 14, 02:33    [15731907]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Павловский Юрий
Member

Откуда:
Сообщений: 13
Shocker.Pro,

Это я нашел прогу в инете, которая делает такой экспорт.
Но данные все не вытаскивает, поэтому надо бы что-то свое.

По большому две задачи:
-Из строк сделать столбцы
-и в поле SUMMARY проедоставить данные в четабельном виде.
16 мар 14, 10:43    [15732267]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 17511
Ок, тогда еще вопрос - почему эта тема именно в msoffice? принципиально на VBA сделать?

(я б написал программку ради практики, только не на VBA и не сейчас, до конца недели, если устроит)
16 мар 14, 11:00    [15732309]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Павловский Юрий
Member

Откуда:
Сообщений: 13
Shocker.Pro,

абсолютно не принципиально в чем написать.

до конца недели устроит.

единственное интересно как же перекодировать текст, если можно потом как-то в двух словах объяснить. Интересно чисто для себя.

в инете попалось описание функции "iconv"
вродибы умеет перекодировать, только это функция скорее для СИ наверное.

В любом случае спасибо. Результат можно отправить на почту admin771@mail.ru
16 мар 14, 11:06    [15732318]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 17511
Павловский Юрий
единственное интересно как же перекодировать текст
в платформе .NET есть встроенные конверторы кодировок
16 мар 14, 11:21    [15732359]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 17511
готово

К сообщению приложен файл (vcsConvertor.zip - 6Kb) cкачать
20 мар 14, 01:09    [15756413]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Павловский Юрий
Member

Откуда:
Сообщений: 13
Shocker.Pro,

Здравствуйте!

Спасибо за программку! Попробовал. Есть одни глючек. В поле имени вытаскивает только 4 символа.

DTSTART,DTEND,AALARM,X-EPOCAGENDAENTRYTYPE,X-BIRTHYEAR,SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8,RRULE
19860426T000000,19860427T000000,19860426T060000Z;;0;,ANNIVERSARY,1986,Алеш=,YM1 4 #0
19810127T000000,19810128T000000,19810127T070000Z;;0;,ANNIVERSARY,1974,Анан=,YM1 1 #0
19810408T000000,19810409T000000,19810408T060000Z;;0;,ANNIVERSARY,1974,Анже=,YM1 4 #0
19810328T000000,19810329T000000,19810328T070000Z;;0;,ANNIVERSARY,1975,Боби=,YM1 3 #0
19811217T000000,19811218T000000,19811217T070000Z;;0;,ANNIVERSARY,1961,Буря=,YM1 12 #0
19810322T000000,19810323T000000,19810322T070000Z;;0;,ANNIVERSARY,1974,Весе=,YM1 3 #0
19811026T000000,19811027T000000,19811026T070000Z;;0;,ANNIVERSARY,1981,Вита =,YM1 10 #0
19811102T000000,19811103T000000,19811102T070000Z;;0;,ANNIVERSARY,1977,Гану=,YM1 11 #0
20 мар 14, 15:10    [15760231]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 17511
Дело в переносе на новую строку. Так как образца реального файла у меня не было, я предполагал, что строка с ФИО цельная. Дайте пожалуйста пару-тройку файлов для экспериментов.
20 мар 14, 15:23    [15760361]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 17511
ну или вот попробуйте

К сообщению приложен файл (vcsConvertor.zip - 6Kb) cкачать
20 мар 14, 16:16    [15760828]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Павловский Юрий
Member

Откуда:
Сообщений: 13
Shocker.Pro,

О, теперь все классно!
Огромное спасибо!

А в чем написана прога, можно код посмотреть?
20 мар 14, 18:57    [15761956]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 17511
Павловский Юрий
А в чем написана прога, можно код посмотреть?
WinForms, C#
+ код
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;

namespace vcsConvertor
{
  public partial class Form1 : Form
  {
    bool folderSelected = false;
    bool fileSelected = false;
    public Form1()
    {
      InitializeComponent();
      saveFileDialog1.Filter = "*.csv|*.csv";
    }

    private void btSelectFolder_Click(object sender, EventArgs e)
    {
      if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
      {
        lbFolder.Text = folderBrowserDialog1.SelectedPath;
        folderSelected = true;
        saveFileDialog1.InitialDirectory = folderBrowserDialog1.SelectedPath;
        if (fileSelected) btConvert.Enabled = true;
      }
    }

    private void btFile_Click(object sender, EventArgs e)
    {
      if (saveFileDialog1.ShowDialog() == DialogResult.OK)
      {
        lbFile.Text = saveFileDialog1.FileName;
        fileSelected = true;
        if (folderSelected) btConvert.Enabled = true;
      }
    }

    private void btConvert_Click(object sender, EventArgs e)
    {
      var headers = new List<string>(new string[] { "DTSTART", "DTEND", "AALARM", "X-EPOCAGENDAENTRYTYPE", "X-BIRTHYEAR", "SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8", "RRULE" });
      var list = new Dictionary<string, string>();
      string[] line;
      string t;
      var lineout = new List<string>();
      string prevQPKey = "";

      try
      {
        using (StreamWriter dest = new StreamWriter(saveFileDialog1.FileName,false, Encoding.UTF8))
        {
          fdLog.AppendText(string.Format("создан файл: {0}\n",saveFileDialog1.FileName));
          foreach (string p in headers) { lineout.Add(p); }
          dest.WriteLine(string.Join(",",lineout.ToArray()));

          try
          {
            DirectoryInfo folder = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
            foreach (FileInfo file in folder.GetFiles("*.vcs"))
            {
              try
              {
                using (StreamReader source = new StreamReader(file.FullName))
                {
                  list.Clear();
                  lineout.Clear();
                  while (!source.EndOfStream)
                  {
                    line = source.ReadLine().Split(new Char[] {':'});
                    if (line.Length == 2)
                    {
                      if (line[0].Contains("QUOTED-PRINTABLE"))
                      {
                        line[1] = DecodeQuotedPrintable(line[1].TrimEnd('='), "utf-8");
                        prevQPKey = line[0];
                      }
                      else prevQPKey = "";
                      list[line[0]] = line[1];
                    }
                    else if (line.Length == 1 && line[0].Substring(0, 1) == "=" && prevQPKey != "")
                    {
                      list[prevQPKey] += DecodeQuotedPrintable(line[0].TrimEnd('='), "utf-8");
                    }
                  }
                }
                foreach (string p in headers)
                {
                  if (list.TryGetValue(p, out t)) lineout.Add(t);
                }
                dest.WriteLine(string.Join(",", lineout.ToArray()));
                fdLog.AppendText(string.Format("обработан файл: {0}\n", file.Name));
              }
              catch (Exception ex)
              {
                fdLog.AppendText(string.Format("ошибка при чтении файла: {0}\n", ex.Message));
              }
            }

          }
          catch (Exception ex)
          {
            fdLog.AppendText(string.Format("ошибка при работе с папкой: {0}\n", ex.Message));
          }

          fdLog.AppendText("операция завершена\n");
        }
      }
      catch (Exception ex)
      {
        fdLog.AppendText(string.Format("ошибка при записи файла: {0}\n", ex.Message));
      }
    }

    // http://stackoverflow.com/questions/11793734/code-for-encode-decode-quotedprintable
    // коверторы QPRINTABLE
    public static string DecodeQuotedPrintable(string input, string charSet)
    {
      Encoding enc;

      try
      {
        enc = Encoding.GetEncoding(charSet);
      }
      catch
      {
        enc = new UTF8Encoding();
      }

      var occurences = new Regex(@"(=[0-9A-Z]{2}){1,}", RegexOptions.Multiline);
      var matches = occurences.Matches(input);

      foreach (Match match in matches)
      {
        try
        {
          byte[] b = new byte[match.Groups[0].Value.Length / 3];
          for (int i = 0; i < match.Groups[0].Value.Length / 3; i++)
          {
            b[i] = byte.Parse(match.Groups[0].Value.Substring(i * 3 + 1, 2), System.Globalization.NumberStyles.AllowHexSpecifier);
          }
          char[] hexChar = enc.GetChars(b);
          input = input.Replace(match.Groups[0].Value, new String(hexChar));
        }
        catch
        { ;}
      }
      input = input.Replace("?=", "").Replace("\r\n", "");

      return input;
    }
  }
}
если хотите редактировать в студии - могу выложить сам проект
20 мар 14, 19:06    [15761994]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Павловский Юрий
Member

Откуда:
Сообщений: 13
Спасибо!

Я в студии не работаю. Просто интересно было как перекодировать УТФ

Спасибо, все понято!
20 мар 14, 20:01    [15762194]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 17511
Павловский Юрий
как перекодировать УТФ
а utf никак и не перекодируется, выходной файл пишется в utf-8. Тут важно, что сам utf-8 поверх еще закодирован в quoted-printable
20 мар 14, 20:49    [15762384]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Конвертировать файл .vcs  [new]
Ляксеич
Guest
Shocker.Pro, здравствуйте.
Уже несколько дней бьюсь с абсолютно аналогичной проблемой, но не помогает ни одна программа, даже Ваша. Казалось бы и соединяет в один файл, и конвертирует в .csv, а при импорте в google calendar пишет "Не удалось импортировать мероприятия: Не удаётся обработать файл iCal/CSV, причем и мои файлы и тот, что Юрий, как образец оставил.
Так у меня выглядит исходный .vcs:
BEGIN:VCALENDAR
VERSION:1.0
BEGIN:VEVENT
"UID;ENCODING=QUOTED-PRINTABLE:16062016113949403375=5B"
"SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=utf-8:="
=207=20=D0=B4=D0=B5=D0=BA=D0=B0=D0=B1=D1=80=D1=8F=201994=20=D0=B3=D0=BE=
=D0=B4=D0=B0=20-=20=D0=9C=D0=B5=D0=B6=D0=B4=D1=83=D0=BD=D0=B0=D1=80=D0=BE=
=D0=B4=D0=BD=D1=8B=D0=B9=20=D0=B4=D0=B5=D0=BD=D1=8C=20=D0=B3=D1=80=D0=B0=
=D0=B6=D0=B4=D0=B0=D0=BD=D1=81=D0=BA=D0=BE=D0=B9=20=D0=B0=D0=B2=D0=B8=D0=
#ИМЯ?
DTSTART:19941207T000000
DTEND:19941208T000000
X-EPOCAGENDAENTRYTYPE:ANNIVERSARY
CLASS:PUBLIC
SEQUENCE:0
X-METHOD:NONE
RRULE:YM1 12 21001207T000000
"AALARM;TYPE=X-EPOCSOUND;ENCODING=QUOTED-PRINTABLE:19941207T081500;;;z:=5Csystem=5CSystemSounds=5Calarm.wav"
LAST-MODIFIED:20160627T055334Z
PRIORITY:0
X-SYMBIAN-LUID:1357
END:VEVENT
END:VCALENDAR

Так после конвертации пяти файлов:

DTSTART,DTEND,AALARM,X-EPOCAGENDAENTRYTYPE,X-BIRTHYEAR,SUMMARY ENCODING=QUOTED-PRINTABLE CHARSET=UTF-8,RRULE
19941207T000000,19941208T000000,ANNIVERSARY,YM1 12 21001207T000000
20170707T000000,20170708T000000,ANNIVERSARY,YM1 7 21000707T000000
19460718T000000,19460719T000000,ANNIVERSARY,YM1 7 21000718T000000
19811207T000000,19811208T000000,ANNIVERSARY,YM1 12 21001207T000000
19451220T000000,19451220T000000,ANNIVERSARY,YM1 12 21001220T000000

Чего не хватает, не пойму, мозгов, наверное(. Может, что посоветуете?

Пример .vcs.
7 окт 17, 22:19    [20851447]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 17511
Ляксеич
и тот, что Юрий, как образец оставил.
дело было давно, может формат файлов календаря поменялся? Попробуйте сделать экспорт мероприятий и сравнить со своим файлом
8 окт 17, 12:50    [20852033]     Ответить | Цитировать Сообщить модератору
 Re: Конвертировать файл .vcs  [new]
Ляксеич
Guest
Shocker.Pro, спасибо за совет. Есть подозрение, что файлы моего календаря то ли некорректные, то ли с ошибками. Юрин файл-пример импортируется в Аутлук и корректно там отображается, - мои нет. Боюсь придётся в рукопашную весь календарь лопатить. В любом случае, за желание помочь - благодарю.
8 окт 17, 14:24    [20852129]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Office Ответить