Показать полную графическую версию : [решено] Работа со строками txt файла.
kirillgoogle
18-06-2012, 06:37
В общем ситуация такая:
Есть файл со строками типа
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
Как раз тут-то и кроется загвоздка: я знаю только batch, который едва ли можно языком назвать) :search: Теорию знаю, но в деталях... Borland C++ Builder 6 для оного сойдёт? :sorry:
Код Drongo как раз для C++ Builder, вроде должен работать в 6 версии
как раз для C++ Builder, вроде должен работать в 6 версии »Будет работать и в шестёрке. Единственное, пробелами разделять слова не идеальный вариант, вдруг в имени или фамилии будет пробел? лучле выбрать другой разделитель, например звёздочку * и исправить здесь
...
chSpace<<'*';
...
kirillgoogle
21-06-2012, 07:59
Я так понимаю, нужно всё содержимое этого документа скопировать в поле 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
Ошибка, хотя OpenDialog благополучно стоит
Забыл единичку приписать :)...
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
...
kirillgoogle
23-06-2012, 06:34
И в новь он еретит ._о
Эх, да у вас вторым разделителем идёт табулятор. Пробуйте так
//---------------------------------------------------------------------------
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
Нет, всё та же ошибка
kirillgoogle, Извините, не верю.
kirillgoogle
26-06-2012, 07:39
Вот спасибо огромное! :clapping: Теперь понял, где беда, я использовал те самый 3 звёздочки, хоть код, по идее, и правил на нужный... Не столь важно, главное - спасибо)) :yahoo:
То что вопрос решился, я рад, но про этого не понял, что, где, какие звёздочки? :)Теперь понял, где беда, я использовал те самый 3 звёздочки »
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.