Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Oksana Гость
|
Добавлено: Пт Июн 27 2003 15:59 Заголовок сообщения: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
Друзья, подскажите, С помощью каких операторов или функций можно осуществить замену знака табуляции на "," в файле с расширением dat с посощью C или Pascal? |
|
Вернуться к началу |
|
|
vladgul Гость
|
Добавлено: Пт Июн 27 2003 16:52 Заголовок сообщения: Re: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
Самый простой и самый долгий вариант (если файл не большой, то не страшно) В паскале: Var FSource, FDestination :File of byte; // Объявляешь типизированные файлы и переменную для чтения. Buff:Byte;
..открываем файлы....
While not eof(F) do //Пока исходный файл не закончен begin read(FSource,Buff); // чтение из файла // проверка на твой символ. If buff=9 then //Если символ табуляции (код 9) Buff:=Ord(','); // Тогда меняем на ',' write(FDEstionation,Buff); end;
..Закрываем файлы... Все. |
|
Вернуться к началу |
|
|
Oksana Гость
|
Добавлено: Пн Июн 30 2003 10:12 Заголовок сообщения: Re: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
Спасибо.
А чем, кроме продолжительности по времени, грозит данный способ, при большом файле (столбцов около 400, а строк около 1000) ? |
|
Вернуться к началу |
|
|
Oksana Гость
|
Добавлено: Пн Июн 30 2003 10:32 Заголовок сообщения: Re: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
Еще один вопросик: если эту замену в Паскале делать долго, то с помощью чего ее можно осуществить еще? |
|
Вернуться к началу |
|
|
vladgul Гость
|
Добавлено: Пн Июн 30 2003 10:33 Заголовок сообщения: Re: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
Ничем не грозит. Если ты хочешь повысить быстродействие, то можно использовать нетипизированные файлы. Var F,F1:File; Buffer:array [1..4096] of byte; I,CountRead:Integer; ..... Reset(F,1); ReWrite(F1,1); .. .. BlockRead(F,Buffer,SizeOf(Buffer),CountRead); I:=1; Wh ile (ii то произошла ошибка записи.
Этот способ намного быстрее. Почитай Help по процедурам BlockRead, BlockWrite
Кстати, а откуда такой файл взялся? Может быть проще вообще ничего не менять? Или в дальнейшем (ты же как-то собираешься использовать эту ',' если программно, то нет никакой разницы бкдет это ',' или знак табуляции. А если потом результат надо будет "подтянуть" в какую-либо программу, то там тоже (скорее всего) можно настроить разделитель колонок. |
|
Вернуться к началу |
|
|
vladgul Гость
|
Добавлено: Пн Июн 30 2003 10:36 Заголовок сообщения: Re: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
Написал хороший ответ, а сервер ругнулся на отсылку сообщения (((( И все пропало (((
Кратко. Почитай help по функциям BlockRead и BlockWrite.
А также, откуда взялся такой файл и как или куда его будешь использовать. Может быть есть способ проще. |
|
Вернуться к началу |
|
|
Oksana Гость
|
Добавлено: Пн Июн 30 2003 12:00 Заголовок сообщения: Re: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
Это файл данных (цифры) сохраненный из программы SPSS как tab-delimited (.dat) и его надо преобразовать (tab заменить на ,), причем в нем около 450 переменных (столбцов) и около 1000 строк. ???? )) |
|
Вернуться к началу |
|
|
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Пн Июн 30 2003 16:17 Заголовок сообщения: Re: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
Файл tab2cma.cpp:
#include #include
#define LEN 2048 #define SEARCHER 9 #define REPLACER ','
int main( int argc, char **argv ) { if( argc != 3 ) return printf( "tab2cma infile outfile\n:" ); FILE *f = fopen( argv[ 1 ], "rb" ); if( !f ) return printf( "can't open file %s for reading\n", argv[ 1 ] ); FILE *o = fopen( argv[ 2 ], "wb" ); if( !o ) return printf( "can't open file %s for writing\n", argv[ 2 ] );
char buf[ LEN ], *p; int l;
while( l = fread( buf, 1, LEN, f ) ) { while( p = (char *)memchr( buf, SEARCHER, l ) ) *p = REPLACER; fwrite( buf, 1, l, o ); }
fclose( o ); fclose( f );
return 0; }
компилил 3-м борландом и проверял. |
|
Вернуться к началу |
|
|
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Пн Июн 30 2003 16:20 Заголовок сообщения: Re: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
Patch: include stdio.h и include conio.h в угловых скобках, которые были приняты за фуфло и проигнорированы ! |
|
Вернуться к началу |
|
|
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Пн Июн 30 2003 16:21 Заголовок сообщения: Re: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
пардон, не conio.h а string.h |
|
Вернуться к началу |
|
|
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Вт Июл 01 2003 11:27 Заголовок сообщения: Re: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
Итак, окончательный вариант :
файл tab2coma.cpp:
#include stdio.h #include string.h
#define LEN 2048 #define SEARCHER 9 #define REPLACER ','
int main( int argc, char **argv ) { if( argc != 3 ) return printf( "usage: tab2coma infile outfile\n:" ); FILE *f = fopen( argv[ 1 ], "rb" ); if( !f ) return printf( "can't open file %s for reading\n", argv[ 1 ] ); FILE *o = fopen( argv[ 2 ], "wb" ); if( !o ) return printf( "can't open file %s for writing\n", argv[ 2 ] );
char buf[ LEN ], *p; int l;
while( l = fread( buf, 1, LEN, f ) ) { for( p=buf; p = (char *)memchr( p, SEARCHER, l - (p-buf) ); ) *p = REPLACER; fwrite( buf, 1, l, o ); }
fclose( o ); fclose( f );
return 0; }
примечания: stdio.h и string.h в угловых скобках. Скорость за 6 МБ/сек на П4-1700 компилятор - Borland C++ 3.1 |
|
Вернуться к началу |
|
|
Oksana Гость
|
Добавлено: Вт Июл 01 2003 14:22 Заголовок сообщения: Re: Замена знака табуляции на "," в файле с расширением dat с посощью C или Pascal |
|
|
Спасибо.
Сейчас проэкпериментирую. |
|
Вернуться к началу |
|
|
|