Старый 15.09.2010, 22:31   #1
kiper_light
 
Аватар для kiper_light
 
Регистрация: 05.07.2010
Сообщений: 6
Репутация: -1
Question Как спарсить параметры из одного txt файла и записать их в другой?

Есть текстовый файл генерируемый программкой и в нем меняется несколько параметров в определенных строках.

Нужно парсить из него эти изменившиеся параметры и записывать эти все параметры в определенные строчки другого файла.


Для наглядности приведу абстрактный пример. В первый файл параметры пишутся примерно так (содержание строк 1,3,5 и 2,4,6 одинаковое, меняются только параметры):

1.txt:

Цитата:
1. a1
2. b1
3. a2
4. b2
5. a3
6. b3
нужно брать их и записывать во второй файл с примерно такой структурой (содержание строк 1,5,9 и 2-4, 6-8, 10-12 тоже одинаковое)

2.txt :

Цитата:
1. a=a1 b=b1
2. b=b1
3. b=b1
4. b=b1
5. a=a2 b=b2
6. b=b2
7. b=b2
8. b=b2
9. a=a3 b=b3
10. b=b3
11. b=b3
12. b=b3
и так далее...


Может кто-нибудь показать как и с помощью чего это можно реализовать? (ось - debian)


p.s. перенесите плиз если не туда запостил..


если пример не понятен, то не обращайте на него внимание. напишу еще раз своими словами: мне нужно из каждой строки парсить и в зависимости от номера строки вставлять их во второй файл. например в строки 3-5 вставлять параметр из первой строки, а в 7-9 из второй строки исходного файла.
kiper_light вне форума   Ответить с цитированием
Старый 15.09.2010, 23:28   #2
kiper_light
 
Аватар для kiper_light
 
Регистрация: 05.07.2010
Сообщений: 6
Репутация: -1
По умолчанию

говорят можно написать на баш шелл используя работу со строками

Цитата:
Специальные функции для этого нету. Обыкновенная работа со стрингами:
1. ищем параметр(слово) в файле, за ним читаем символ "=" после этого считываем набор букав до первого пробела, пишем их в переменный, потом в другой файл... это все можно на баш шелл написать
примерчик по подобному алгоритму никто не может набросать?
kiper_light вне форума   Ответить с цитированием
Старый 15.09.2010, 23:50   #3
Delimiter
 
Регистрация: 12.08.2010
Сообщений: 47
Репутация: 4
По умолчанию

попробуй исправь(уточни) первый пост.... с более подробным примером, напишу на Си!

я нИпонЕл чо ты хотел сказать!
особенно .... какие то присваивания "=" ...
если есть ....только 1 файл как можно формировать 2-й..... я так понял есть старый и новый....

или я не правильно поНИЛ!?

но сначала бы написал функцию

Код:
int havegotfield(char *sourcestr,char *deststr,int nelement,char *delimiterStr,int mode)
{
	int i;
	int mcnt;
	char tstr[300];
	int flrez=0;
	int pstr=0;
	int prepfl;
	*(deststr)=0;
	if(strchr(delimiterStr,*(sourcestr))!=0)
		prepfl=0;
	else
		prepfl=1;
            for(i=0,mcnt=1,flrez=0,prepfl=0;*(sourcestr+i)!=0;i++)
	{
		if(strchr(delimiterStr,*(sourcestr+i))!=NULL)
		{
			if(mode==0)
			{
				if(prepfl!=0)
				{
					if(mcnt<=nelement)
						mcnt++;
					else
						break;
				}
				prepfl=0;
			}
			else
			{
				if(mcnt<=nelement)
					mcnt++;
				else
				{
					flrez=1;
					break;
				}
			}
		}
		else
		{
			if(mcnt==nelement)
			{
				*(deststr+pstr)=*(sourcestr+i);
				pstr++;
				flrez=1;
			}
			prepfl=1;
		}
	}
	*(deststr+pstr)=0;
	return flrez;
}
которая парсит строки с различными делимитерами

далее нужно определить как работать с файлами.... я так и не понял сколько файлов
2(два) или ОДИН меняющийся??????
Delimiter вне форума   Ответить с цитированием
Старый 16.09.2010, 00:12   #4
kiper_light
 
Аватар для kiper_light
 
Регистрация: 05.07.2010
Сообщений: 6
Репутация: -1
По умолчанию

Цитата:
Сообщение от Delimiter Посмотреть сообщение
попробуй исправь(уточни) первый пост.... с более подробным примером, напишу на Си!

я нИпонЕл чо ты хотел сказать!
особенно .... какие то присваивания "=" ...
если есть ....только 1 файл как можно формировать 2-й..... я так понял есть старый и новый....

или я не правильно поНИЛ!?
не совсем так.

в общем есть ТХТ файл №1 - в нем есть строка №9 и там есть такие параметры id=a1&s=b1, потом такая же точно строка №15 - только там значения тех же самых параметров не a1 и b1, а - а2 и b2 соответственно ну и так далее...

и есть ТХТ файл №2 - в нем есть строки № 6, 9, 12, 15 куда нужно записать в параметры a1 и b1 из первого файла из девятой строки,

и есть строки № 18, 21, 23, 25 куда нужно записать в параметры a2 и b2 из первого файла из пятнадцатой строки.


вот как то так примерно
kiper_light вне форума   Ответить с цитированием
Старый 16.09.2010, 00:24   #5
Delimiter
 
Регистрация: 12.08.2010
Сообщений: 47
Репутация: 4
По умолчанию

строки нумеруются
1. ХХХ
2. ХХХ
????

в каждой строке id=ххх&s=ххх или только в тобой указанных?

символ разделитель - & ?

вообще я бы дал полный аналог файлов
Delimiter вне форума   Ответить с цитированием
Старый 16.09.2010, 00:34   #6
kiper_light
 
Аватар для kiper_light
 
Регистрация: 05.07.2010
Сообщений: 6
Репутация: -1
По умолчанию

Цитата:
Сообщение от Delimiter Посмотреть сообщение
строки нумеруются
1. ХХХ
2. ХХХ
????

в каждой строке id=ххх&s=ххх или только в тобой указанных?
строки в файле без нумерации ( . (это я номера написал чтобы было понятно)

а параметры id=ххх&s=ххх в не в каждой строке, а только в определенных
kiper_light вне форума   Ответить с цитированием
Старый 16.09.2010, 00:44   #7
fury
 
Регистрация: 11.07.2010
Сообщений: 9
Репутация: 1
По умолчанию

Код:
perl -pe 's/(.)/$1=$1/; $. & 1 ? tr/\r\n/ / : ($_ x= 4)' < 1.txt > 2.txt
Код:
$ cat 1.txt
a1
b1
a2
b2
a3
b3
$ perl -pe 's/(.)/$1=$1/; $. & 1 ? tr/\r\n/ / : ($_ x= 4)' < 1.txt > 2.txt
$ cat 2.txt
a=a1 b=b1
b=b1
b=b1
b=b1
a=a2 b=b2
b=b2
b=b2
b=b2
a=a3 b=b3
b=b3
b=b3
b=b3
Холивар? Жду питонщиков с лекциями про "читабельность".
fury вне форума   Ответить с цитированием
Старый 16.09.2010, 01:03   #8
kiper_light
 
Аватар для kiper_light
 
Регистрация: 05.07.2010
Сообщений: 6
Репутация: -1
По умолчанию

в общем смотрите, я здесь немного подумал - впринципе можно не парсить параметры, а просто кусочек строки заданной копировать сначала и до слова, например, ATTR=NAME, и в указанных строчках во втором файле этот кусочек перезаписывать.

может быть как то так проще будет? только вот как указать строки нужные?
kiper_light вне форума   Ответить с цитированием
Старый 16.09.2010, 01:10   #9
Delimiter
 
Регистрация: 12.08.2010
Сообщений: 47
Репутация: 4
По умолчанию

на Си примерно так .... функция havegotfield() дана в моем первом ответе!

и теперь функция
Код:
void my_func(char *fname1,char *fname2, char *tmpfile,char *param1,char *param2,char *del_g,char *del_int)
{
	FILE *f,*f2;
         int i,l;
	char line[1500];
	char dstr[500];
	char dstr2[500];
         char first[100];
   	char second[100];
	char third[100];
	char forth[100];
  	if( (f = fopen(fname1, "rt" )) != NULL )
	{
	  for(i=1;fgets( line, 1400, f ) != NULL;i++)
	  {
                  switch(i)
		 {
		 case 9:
			 for(l=1;havegotfield(line,dstr,l,del_g,1)!=0;l++)
			 {
                                 havegotfield(dstr,dstr2,1,del_int,1);
                                 if(strcmp(dstr2,param1)==0 && strlen(dstr2)==strlen(param1))
                                      havegotfield(dstr,first,2,del_int,1);
		               else
                                    if(strcmp(dstr2,param2)==0 && strlen(dstr2)==strlen(param2))
                                         havegotfield(dstr,second,2,del_int,1);
			 }
			 break;
		 case 15:
			 for(l=1;havegotfield(line,dstr,l,del_g,1)!=0;l++)
			 {
				 havegotfield(dstr,dstr2,1,del_int,1);
				 if(strcmp(dstr2,param1)==0 && strlen(dstr2)==strlen(param1))
					 havegotfield(dstr,third,2,del_int,1);
				 else
					 if(strcmp(dstr2,param2)==0 && strlen(dstr2)==strlen(param2))
						 havegotfield(dstr,forth,2,del_int,1);
			 }
			 break;
		 }
	  }
	  fclose(f);
	}
	if( (f = fopen(fname2, "rt" )) != NULL )
	{
             if((f2=fopen(tmpfile,"wt"))!=NULL)
	   {
		for(i=1;fgets( line, 1400, f ) != NULL;i++)
		{
                     fputs(line,f2);
                     switch(i)
		   {
		   case 6:
		   case 9:
		   case 12:
		   case 15:
                            fputs(del_g,f2); fputs(param1,f2); fputs(del_int,f2);
                            fputs(first,f2);
			   fputs(del_g,f2); fputs(param2,f2); fputs(del_int,f2);
			   fputs(second,f2);
			   break;
                     case 18:
		   case 21:
		   case 23:
		   case 25:
                            fputs(del_g,f2); fputs(param1,f2); fputs(del_int,f2);
                            fputs(third,f2);
			   fputs(del_g,f2); fputs(param2,f2); fputs(del_int,f2);
			   fputs(forth,f2);
			   break;
		   }
		}
		fclose(f2);
	   }
	  fclose(f);
	}
         remove(fname2);
	rename(tmpfile,fname2);
}
пример использования
my_func("c:\\1.txt","c:\\2.txt","c:\\tmp.txt","id" ,"s","&","=");

НЕ ТЕСТИРОВАЛ .... показываю примерно КАК! (последние изменения 2:50)

справедливо для строк типа:

...= ... & ... = .... & ... = ... & ... итд
знаки "=" и "&" - официально делимитеры (символы разделители)

'&' -ОБЩИЙ
'=' -Внутреннй

если же .... как в твоем первом посте
a=a2 b=b2

в этом случае
пробел -Общий
'=' -Внутренний
пример использования
my_func("c:\\1.txt","c:\\2.txt","c:\\tmp.txt","id" ,"s"," ","=");
Delimiter вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot