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:
|
Заготовка написана на коленке, С++
Код:
//---------------------------------------------------------------------------
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();
}
}
//---------------------------------------------------------------------------
|
Могу предложить такое решение.
Код:
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.
|
Автор походу даже не озвучил, на каком языке ему нужна реализация. :)
|
kirillgoogle |
19-06-2012 22:50 1937285 |
Как раз тут-то и кроется загвоздка: я знаю только batch, который едва ли можно языком назвать) :search: Теорию знаю, но в деталях... Borland C++ Builder 6 для оного сойдёт? :sorry:
|
Код Drongo как раз для C++ Builder, вроде должен работать в 6 версии
|
Цитата:
Цитата ferget
как раз для C++ Builder, вроде должен работать в 6 версии »
|
Будет работать и в шестёрке. Единственное, пробелами разделять слова не идеальный вариант, вдруг в имени или фамилии будет пробел? лучле выбрать другой разделитель, например звёздочку * и исправить здесь
Код:
...
chSpace<<'*';
...
|
kirillgoogle |
21-06-2012 07:59 1937971 |
Я так понимаю, нужно всё содержимое этого документа скопировать в поле MEMO1, да? Только при этом у меня вся кириллица заменяется вопросительными знаками, какую нужно использовать кодировку?
|
У формы свойство 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 благополучно стоит
|
Забыл единичку приписать :)
Код:
...
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
...
|
kirillgoogle |
23-06-2012 06:34 1939153 |
Вложений: 1
И в новь он еретит ._о
|
Эх, да у вас вторым разделителем идёт табулятор. Пробуйте так
Код:
//---------------------------------------------------------------------------
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 |
Нет, всё та же ошибка
|
Вложений: 1
kirillgoogle, Извините, не верю.
|
kirillgoogle |
26-06-2012 07:39 1940556 |
Вот спасибо огромное! :clapping: Теперь понял, где беда, я использовал те самый 3 звёздочки, хоть код, по идее, и правил на нужный... Не столь важно, главное - спасибо)) :yahoo:
|
То что вопрос решился, я рад, но про этого не понял, что, где, какие звёздочки? :)
Цитата:
Цитата kirillgoogle
Теперь понял, где беда, я использовал те самый 3 звёздочки »
|
|
Время: 09:49.
© OSzone.net 2001-