Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Скрипт для нарезки текстового файла  (Прочитано 46933 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Xray
Гость
« : 08-07-2009 10:47 » 

Нужен простейший скрипт(в программировании не разбираюсь) для выделения из огромного текстового файла определенного куска, файл содержит данные типа даты, время (ггггммччвввв) и 4 числа через пробелы , т.е например:
200904130215 0.72195 0.72195 0.72175 0.72175
200904130216 0.72175 0.72185 0.72175 0.72185
200904130217 0.72185 0.72185 0.72185 0.72185
200904130218 0.72185 0.72185 0.72185 0.72185
200904130219 0.72185 0.72185 0.72175 0.72185
200904130220 0.72185 0.72205 0.72185 0.72195
200904130221 0.72195 0.72195 0.72185 0.72185

Надо чтобы допустим из этого примера вырезать
200904130217 0.72185 0.72185 0.72185 0.72185
200904130218 0.72185 0.72185 0.72185 0.72185
200904130219 0.72185 0.72185 0.72175 0.72185

Спасибо

Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #1 : 08-07-2009 11:01 » 

Цитата
Нужен простейший скрипт(в программировании не разбираюсь)
Так это тебе работника искать надо...
Записан

Удачного всем кодинга! -=x[PooH]x=-
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 08-07-2009 11:02 » 

Надо чтобы допустим из этого примера вырезать
200904130217 0.72185 0.72185 0.72185 0.72185
200904130218 0.72185 0.72185 0.72185 0.72185
200904130219 0.72185 0.72185 0.72175 0.72185



а по какому критерию вырезано то ? За числа определённые ?
Записан

Xray
Гость
« Ответ #3 : 08-07-2009 11:02 » 

А что местных умельцев нет? (хотя бы подсказать в каком направлении работать)
Записан
Xray
Гость
« Ответ #4 : 08-07-2009 11:03 » 

Надо чтобы допустим из этого примера вырезать
200904130217 0.72185 0.72185 0.72185 0.72185
200904130218 0.72185 0.72185 0.72185 0.72185
200904130219 0.72185 0.72185 0.72175 0.72185



а по какому критерию вырезано то ? За числа определённые ?


Да с определенного числа и времени по определенное число и время
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #5 : 08-07-2009 11:15 » 

Цитата
хотя бы подсказать в каком направлении работать
Хоть операционка какая?
И насколько большой файл? сколько в нем строк? Можно тупо импортировать в ексель и вырезать руками или макросом.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Xray
Гость
« Ответ #6 : 08-07-2009 11:22 » 

Цитата
хотя бы подсказать в каком направлении работать
Хоть операционка какая?
И насколько большой файл? сколько в нем строк? Можно тупо импортировать в ексель и вырезать руками или макросом.

В том то и проблема, что файл огромный и при загрузке в ексель, пишет что файл загружен не полностью, размер этого текстового файла примерно 9.5 МБ. Операционка winda 2003
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 08-07-2009 11:25 » 

Ну, если весь файл состоит из таких записей, то проще всего, имхо, с помощью регулярного выражения вырезать дату в каждой строке и проверять на попадание в диапазон.
Сравнение - хоть в строковой форме: в таком формате даты будут соблюдать лексикографический порядок.
Если файл отсортирован по времени, то сначала искать начало диапазона (соответственно, проверять, что дата больше или равна заданной начальной), а затем "вырезать" до тех пор, пока не будет достигнут конец диапазона (проверять, что дата меньше или равна заданной конечной).

Делать любым скриптовым языком.
Записан
Xray
Гость
« Ответ #8 : 08-07-2009 11:25 » 

сколько в нем строк?
Больше 65536
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 08-07-2009 11:38 » 

А чего тут работать?

1. Разбиваем текст на строки (надеюсь признак конца строки 0x0d 0x0a ?)

2. бежим по всему массиву и ищем начало блока. Критерий поиска у тебя есть - проверка на совпадение начала каждой строки с образцом известной длины, в твоём примере - "200904130217".

3. Если нашли, отправляем эту и следующие строки в буфер пока не найдём конец блока (аналагично п.2). Найденая таким образом строка (элемент массива) тоже отправляется в буфер.

4. Повторяем пока элементы массива не кончатся, или пока не найдём конец блока. Ну тут уже тебе решать, что делать если конец не найден.

5. Всё

зы Да, забыл. Буфер сохраняем в файл или делаем с ним что надо.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 08-07-2009 11:45 » 

Если была бы *nix система, то можно было бы обратить внимание на программу split. Ну и на худой конец sed или awk.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 08-07-2009 11:49 » 

Код:
for /F "tokens=1,2,3,4,5 delims= " %%i in (my_file.txt) do if /i not %%j == %%m  @echo %%i %%j %%k %%l %%m
« Последнее редактирование: 08-07-2009 11:54 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 08-07-2009 11:51 » 

главное знать условия отбора
я увидел только то, что второе поле  равно последнему
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 08-07-2009 11:52 » 

Да с определенного числа и времени по определенное число и время


аааа!!

анализируем %%i
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 08-07-2009 11:54 » 

извините забыл
bat- файл
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 08-07-2009 11:54 » 

Xray, такой файл можно импортировать в Access, а далее есть визуальное создание запросов.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Xray
Гость
« Ответ #16 : 08-07-2009 11:54 » 

Ну, если весь файл состоит из таких записей, то проще всего, имхо, с помощью регулярного выражения вырезать дату в каждой строке и проверять на попадание в диапазон.
Сравнение - хоть в строковой форме: в таком формате даты будут соблюдать лексикографический порядок.
Если файл отсортирован по времени, то сначала искать начало диапазона (соответственно, проверять, что дата больше или равна заданной начальной), а затем "вырезать" до тех пор, пока не будет достигнут конец диапазона (проверять, что дата меньше или равна заданной конечной).

Делать любым скриптовым языком.
главное знать условия отбора
я увидел только то, что второе поле  равно последнему

Условия простые: От одной даты до другой, 4 последующих числа - рандомные и не важны(просто может пример не удачный)
Записан
Xray
Гость
« Ответ #17 : 08-07-2009 12:00 » 

Xray, такой файл можно импортировать в Access, а далее есть визуальное создание запросов.

Данный файл не распознается в Access(а если быть точнее: 1 колонка (дата и время) не експортятся)
« Последнее редактирование: 08-07-2009 12:11 от Xray » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 08-07-2009 12:12 » 

Xray, я уже все написал, тебе только подправить, мой код нужно только чуть-чуть допилить до нужного






Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Xray
Гость
« Ответ #19 : 08-07-2009 12:16 » 

Sla, Этот код for /F "tokens=1,2,3,4,5 delims= " %%i in (my_file.txt) do if /i not %%j == %%m  @echo %%i %%j %%k %%l %%m
 вообще куда вбивается Улыбаюсь
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 08-07-2009 12:18 » 

есть такое командная строка
в ней работают bat файлы, cmd файлы
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 08-07-2009 12:22 » 

Тупая реализация на Perl для упорядоченного по времени файла (без оптимизации, будет выполнять 2 сравнения для каждой строки):
Код: (Perl)
if (@ARGV > 1)
{
        my $date1 = shift;
        my $date2 = shift;
        while(<>)
        {
                my ($dat) = /^(\d+)/;
                if ($dat gt $date2){
                        last;
                }
                elsif ($dat ge $date1){
                        print;
                }
        }
}
2 параметра командной строки - даты начала и конца отрезка в том же формате, что и в файле (типа 200904130215)
« Последнее редактирование: 08-07-2009 12:25 от Вад » Записан
Xray
Гость
« Ответ #22 : 08-07-2009 12:23 » 

есть такое командная строка
в ней работают bat файлы, cmd файлы

А ты можешь по моему 1 примеру (см. топ) выписать код, тогда я думаю разберусь Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 08-07-2009 12:49 » 

Xray, такой файл можно импортировать в Access, а далее есть визуальное создание запросов.

Данный файл не распознается в Access(а если быть точнее: 1 колонка (дата и время) не експортятся)

Легко!!!
Импорт.
*.txt
С разделителями - пробел.
Тип полей - текстовые.

Выборка:
Код:
SELECT Test.*
FROM Test
WHERE (((Test.Поле1) Between '200904130200' And '200904130220'))
ORDER BY Test.Поле1;
« Последнее редактирование: 08-07-2009 12:53 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #24 : 08-07-2009 12:55 » 

Цитата
Больше 65536
Эксель 2007 умеет работать с более чем 1млн. строк на листе.

Цитата
Больше строк и столбцов и другие новые ограничения
Чтобы можно было исследовать большие объемы данных на листах, Office Excel 2007 поддерживает листы размером до одного миллиона строк и 16-ти тысяч столбцов. Так сетка Office Excel 2007 состоит из 1 048 576 строк и 16 384 столбцов, что обеспечивает увеличение числа строк на 1500% и столбцов на 6300% по сравнению с приложением Microsoft Office Excel 2003. И вот почему: нумерация столбцов теперь оканчивается на XFD вместо IV.
« Последнее редактирование: 08-07-2009 12:57 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 08-07-2009 12:56 » 

упс....
не работает

for /F "tokens=1,2,3,4,5 delims= " %%i in (%1) do if /i '%%i' GTR '%2' (echo 111) else echo 000

Подставляю EQU - работает

GTR не работает
запускаю

proba.bat my_file.txt 20090413020

если кому нужна справка Улыбаюсь
hh ntcmds.chm



Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #26 : 08-07-2009 13:27 » 

1. создать файл
test.bat
следующего содержания
Код:
for /F "tokens=1,2,3,4,5 delims= " %%i in (%1) do (
if /i '%%i' GTR '%2' (if /i '%%i' LSS '%3'  @echo %%i %%j %%k %%l %%m
))

запустить из командной строки

test.bat <имя файла> <дата первая> <дата вторая>

на приведенных данных работает
test.bat my_file.txt 200904130217 200904130220
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 08-07-2009 14:25 » 

В Windows есть такая штатная вещь, как WSH (Windows Script Host).

Можно вот этот код:
Код: (Text)
Const ForReading = 1, ForWriting = 2
Dim FileSystemObject, InputFile, OutputFile
Set FileSystemObject = CreateObject("Scripting.FileSystemObject")
Source = WScript.Arguments(0)
Destination = Source + "_Result.txt"
Set InputFile = FileSystemObject.OpenTextFile(Source, ForReading)
Set OutputFile = FileSystemObject.OpenTextFile(Destination, ForWriting, True)
MinDate = CDbl(InputBox("Введи минимальную дату в формате ГГГГММДДччмм", "Фильтр данных"))
MaxDate = CDbl(InputBox("Введи максимальную дату в формате ГГГГММДДччмм", "Фильтр данных"))
While Not InputFile.AtEndOfStream
 Line = InputFile.ReadLine
 DateInLine = CDbl(Split(Line, " ")(0))
 If DateInLine >= MinDate And DateInLine <= MaxDate Then
  Call OutputFile.WriteLine(Line)
 End If
Wend
Call InputFile.Close
Call OutputFile.Close
WScript.Echo("Результат записан в файл " + Destination)
Записать в файл с расширением vbs, например filter.vbs

Затем в проводнике перетащить мышью файл с данными на этот созданный файл. Запустится скрипт, который будет обрабатывать "брошенный" на него текстовый файл. Кроме того скрипт запросит у юзера даты диапазона фильтрации.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Xray
Гость
« Ответ #28 : 08-07-2009 14:39 » 

Dimka, СПАСИБО ОГРОМНОЕ, ТЫ просто гений!!!! респект тебе!
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #29 : 09-07-2009 07:54 » 

Ну раз пошла такая пьянка...

Xray, держи фирменный софт. Ага

* TxtExtractor.zip (95.09 Кб - загружено 1056 раз.)
« Последнее редактирование: 09-07-2009 08:03 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines