Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Работа со строками txt файла. (http://forum.oszone.net/showthread.php?t=236869)

kirillgoogle 18-06-2012 06:37 1936090

Работа со строками txt файла.
 
В общем ситуация такая:
Есть файл со строками типа
Код:

1Имя 1Фамилия        8946546464
2Имя 2Фамилия        894646546
3Имя 3Фамилия        8978975999

И нужен скрипт, который бы создавал файлы с такими записями (если из примера):
1 файл:
Код:

BEGIN:VCARD
VERSION:2.1
N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:1Имя 1Фамилия
TEL;WORK:8946546464
END:VCARD

2 файл:
Код:

BEGIN:VCARD
VERSION:2.1
N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:2Имя 2Фамилия
TEL;WORK:894646546
END:VCARD

3 файл:
Код:

BEGIN:VCARD
VERSION:2.1
N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:3Имя 3Фамилия
TEL;WORK:8978975999
END:VCARD

и т.д.

Заранее громадное спасибо :wink:

Drongo 19-06-2012 15:03 1936944

Заготовка написана на коленке, С++
Код:

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString fName, lName, nTelefon, NameFile;
  TSysCharSet chSpace;
  chSpace<<' ';
  TStringList *TokenSpace = new TStringList();
  Memo2->Clear();

  for(int i = 0; i < Memo1->Lines->Count; i++){
          ExtractStrings(chSpace, chSpace, Memo1->Lines->Strings[i].c_str(), TokenSpace);
          // Здесь можно поставить проверку на то что
          // все три необходимые записи (имя, фамилия, телефон) - есть.
          fName = TokenSpace->Strings[0];
          lName = TokenSpace->Strings[1];
          nTelefon = TokenSpace->Strings[2];
          Memo2->Lines->Add("BEGIN:VCARD");
          Memo2->Lines->Add("VERSION:2.1");
          Memo2->Lines->Add("N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:" + fName + " " + lName);
          Memo2->Lines->Add("TEL;WORK:" + nTelefon);
          Memo2->Lines->Add("END:VCARD");
          NameFile = String(FormatFloat("000", i) + ".txt");
          Memo2->Lines->SaveToFile(NameFile);
          TokenSpace->Clear();
          Memo2->Clear();
        }
}
//---------------------------------------------------------------------------


PhilB 19-06-2012 18:03 1937078

Могу предложить такое решение.
Код:

awk '{print "BEGIN:VCARD\nVERSION:2.1\nN;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:",$1$2,"\nTEL;WORK:"$3"END:VCARD" ;}' input_file | split -l 5
Если вы под виндой, то необходимо установить awk и split.

Drongo 19-06-2012 22:00 1937240

Автор походу даже не озвучил, на каком языке ему нужна реализация. :)

kirillgoogle 19-06-2012 22:50 1937285

Как раз тут-то и кроется загвоздка: я знаю только batch, который едва ли можно языком назвать) :search: Теорию знаю, но в деталях... Borland C++ Builder 6 для оного сойдёт? :sorry:

ferget 19-06-2012 23:28 1937309

Код Drongo как раз для C++ Builder, вроде должен работать в 6 версии

Drongo 20-06-2012 13:20 1937525

Цитата:

Цитата ferget
как раз для C++ Builder, вроде должен работать в 6 версии »

Будет работать и в шестёрке. Единственное, пробелами разделять слова не идеальный вариант, вдруг в имени или фамилии будет пробел? лучле выбрать другой разделитель, например звёздочку * и исправить здесь
Код:

...
  chSpace<<'*';
...


kirillgoogle 21-06-2012 07:59 1937971

Я так понимаю, нужно всё содержимое этого документа скопировать в поле MEMO1, да? Только при этом у меня вся кириллица заменяется вопросительными знаками, какую нужно использовать кодировку?

Drongo 21-06-2012 16:57 1938288

У формы свойство Charset поставьте Russian_Charset или добавьте вот такие строки, при нажатии на кнопку выскочит диалоговое окно добавления файла, добавьте компонент OpenDialog на форму.

Код:

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString fName, lName, nTelefon, NameFile;
  TSysCharSet chSpace;
  chSpace<<' ';
  TStringList *TokenSpace = new TStringList();
  Memo2->Clear();
  if(OpenDialog1->Execute()){
  Memo1->Lines->LoadFromFile(OpenDialog->FileName);
      for(int i = 0; i < Memo1->Lines->Count; i++){
        ExtractStrings(chSpace, chSpace, Memo1->Lines->Strings[i].c_str(), TokenSpace);
        // Здесь можно поставить проверку на то что
        // все три необходимые записи (имя, фамилия, телефон) - есть.
        fName = TokenSpace->Strings[0];
        lName = TokenSpace->Strings[1];
        nTelefon = TokenSpace->Strings[2];
        Memo2->Lines->Add("BEGIN:VCARD");
        Memo2->Lines->Add("VERSION:2.1");
        Memo2->Lines->Add("N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:" + fName + " " + lName);
        Memo2->Lines->Add("TEL;WORK:" + nTelefon);
        Memo2->Lines->Add("END:VCARD");
        NameFile = String(FormatFloat("000", i) + ".txt");
        Memo2->Lines->SaveToFile(NameFile);
        TokenSpace->Clear();
        Memo2->Clear();
      }
  }
}
//---------------------------------------------------------------------------


kirillgoogle 22-06-2012 09:11 1938590

Вложений: 1
Ошибка, хотя OpenDialog благополучно стоит

Drongo 22-06-2012 13:59 1938751

Забыл единичку приписать :)
Код:

...
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
...


kirillgoogle 23-06-2012 06:34 1939153

Вложений: 1
И в новь он еретит ._о

Drongo 23-06-2012 14:08 1939295

Эх, да у вас вторым разделителем идёт табулятор. Пробуйте так

Код:

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString fName, lName, nTelefon, NameFile;
  TSysCharSet chSpace;
  chSpace<<' '<<'\t';
  TStringList *TokenSpace = new TStringList();
  Memo2->Clear();
  if(OpenDialog1->Execute()){
          Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
          for(int i = 0; i < Memo1->Lines->Count; i++){
                ExtractStrings(chSpace, chSpace, Memo1->Lines->Strings[i].c_str(), TokenSpace);
                // Здесь можно поставить проверку на то что
                // все три необходимые записи (имя, фамилия, телефон) - есть.
                fName = TokenSpace->Strings[0];
                lName = TokenSpace->Strings[1];
                nTelefon = TokenSpace->Strings[2];
                Memo2->Lines->Add("BEGIN:VCARD");
                Memo2->Lines->Add("VERSION:2.1");
                Memo2->Lines->Add("N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:" + fName + " " + lName);
                Memo2->Lines->Add("TEL;WORK:" + nTelefon);
                Memo2->Lines->Add("END:VCARD");
                NameFile = String(FormatFloat("000", i) + ".txt");
                Memo2->Lines->SaveToFile(NameFile);
                TokenSpace->Clear();
                Memo2->Clear();
          }
  }
}
//---------------------------------------------------------------------------


kirillgoogle 25-06-2012 08:20 1940010

Нет, всё та же ошибка

Drongo 25-06-2012 15:38 1940235

Вложений: 1
kirillgoogle, Извините, не верю.

kirillgoogle 26-06-2012 07:39 1940556

Вот спасибо огромное! :clapping: Теперь понял, где беда, я использовал те самый 3 звёздочки, хоть код, по идее, и правил на нужный... Не столь важно, главное - спасибо)) :yahoo:

Drongo 26-06-2012 14:00 1940761

То что вопрос решился, я рад, но про этого не понял, что, где, какие звёздочки? :)
Цитата:

Цитата kirillgoogle
Теперь понял, где беда, я использовал те самый 3 звёздочки »



Время: 09:49.

Время: 09:49.
© OSzone.net 2001-