Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 15 из 21

Тема: Поиск в тексте: вопросы по регулярным выражениям

  1. #1
    Фотограф Аватар для Ilya Skuratov
    Регистрация
    11.03.2004
    Сообщений
    492
    Спасибо
    я - 0; мне - 4

    Вопрос Поиск в тексте: вопросы по регулярным выражениям

    Модераторы извините если не сюда запостил.
    Возможно ли изменение формата вывода даты?
    Подскажите пожалуйста как сделать преобразование записей.
    есть файл CSV, в нем 20000 тысяч строк, в каждой строке запись вида:
    2007.09.20
    2001.10.21
    2000.11.22
    1999.08.01
    и таких строк 20000шт.
    нужно поменять на 20.09.2007.
    Спасибо.
    P.S. Если возможно то чтобы это делал однифайл или что то в этом духе, не знаю как правильно назвать.

  2. #2
    Администратор, Консультант по математике
      За вклад в развитие форума 2006, Лучший знаток физики 2007, Самый активный автор месяца. Август 2007, Лучший консультант 2007, Лучший супермодератор 2007, Народный модератор раздела "Наука и Образование" 2008, Лучший супермодератор 2008, Лучший консультант 2008
    Аватар для Trotil
    Регистрация
    15.12.2005
    Адрес
    град Москва
    Сообщений
    5,890
    Записей в блоге
    26
    Спасибо
    я - 57; мне - 380
    Все строчки заменить на одну и ту же дату?
    Или для каждой строчки своя дата? (что логичнее)
    Ленивый дурак - это полбеды; деятельный дурак - это для всех головная боль, но нет ничего хуже, чем дурак с инициативой, да ещё и при должности.

  3. #3
    Фотограф Аватар для Ilya Skuratov
    Регистрация
    11.03.2004
    Сообщений
    492
    Спасибо
    я - 0; мне - 4
    Цитата Сообщение от Trotil
    для каждой строчки своя дата
    Для каждой строчки своя дата, т.е. фактически нужно поменять местами год и число.

  4. #4
    Администратор, Консультант по математике
      За вклад в развитие форума 2006, Лучший знаток физики 2007, Самый активный автор месяца. Август 2007, Лучший консультант 2007, Лучший супермодератор 2007, Народный модератор раздела "Наука и Образование" 2008, Лучший супермодератор 2008, Лучший консультант 2008
    Аватар для Trotil
    Регистрация
    15.12.2005
    Адрес
    град Москва
    Сообщений
    5,890
    Записей в блоге
    26
    Спасибо
    я - 57; мне - 380
    Код HTML:
    <html><head><title>Изменение формата даты</title></head>
    
    <body>
    <script type="text/javascript">
    re = /(\d+).(\d+).(\d+)/g;
    str = "2007.09.20<br>2001.10.21";
    newstr = str.replace(re, "$3.$2.$1");
    document.write(newstr)
    </SCRIPT>
    </body></html>
    Выводит:
    20.09.2007
    21.10.2001

    Это набросок к решению )

    Теперь надо думать, как это решение подогнать к условиям задачи.

    У меня сейчас нет среды программирования, чтобы сделать exe-файл, а в jscript данная задача невыполнима...

    Можно скинуть тот файл? Я попробую на php сделать тем же методом.
    Ленивый дурак - это полбеды; деятельный дурак - это для всех головная боль, но нет ничего хуже, чем дурак с инициативой, да ещё и при должности.

  5. #5
    Фотограф Аватар для Ilya Skuratov
    Регистрация
    11.03.2004
    Сообщений
    492
    Спасибо
    я - 0; мне - 4
    Спасибо за помощь.
    Вот файл примерный, я не стал все 20000 строк выкладывать.

  6. #6
    Администратор, Консультант по математике
      За вклад в развитие форума 2006, Лучший знаток физики 2007, Самый активный автор месяца. Август 2007, Лучший консультант 2007, Лучший супермодератор 2007, Народный модератор раздела "Наука и Образование" 2008, Лучший супермодератор 2008, Лучший консультант 2008
    Аватар для Trotil
    Регистрация
    15.12.2005
    Адрес
    град Москва
    Сообщений
    5,890
    Записей в блоге
    26
    Спасибо
    я - 57; мне - 380
    В присланном файле дата следующего вида: 10/17/2007
    Заменил на 17/10/2007

    Было:
    10/25/2007,,8763,9052,8754,9046
    10/24/2007,,8517,8779,8468,8710
    10/23/2007,,8577,8679,8482,8527
    10/22/2007,,8886,8886,8617,8756
    10/19/2007,,8974,9007,8786,8860
    ...
    Стало:
    25/10/2007,,8763,9052,8754,9046
    24/10/2007,,8517,8779,8468,8710
    23/10/2007,,8577,8679,8482,8527
    22/10/2007,,8886,8886,8617,8756
    19/10/2007,,8974,9007,8786,8860
    ...
    Программа:
    PHP код:
    <?php 
    $a
    =file_get_contents("123.csv");     
    $pattern "/(\d+)\/(\d+)\/(\d+),,/";
    $replacement "$2/$1/$3,,";
    echo 
    preg_replace($pattern$replacement$a);
    echo 
    $a;
    ?>
    Ленивый дурак - это полбеды; деятельный дурак - это для всех головная боль, но нет ничего хуже, чем дурак с инициативой, да ещё и при должности.

  7. #7
    Фотограф Аватар для Ilya Skuratov
    Регистрация
    11.03.2004
    Сообщений
    492
    Спасибо
    я - 0; мне - 4
    Цитата Сообщение от Trotil
    25/10/2007,,8763,9052,8754,9046
    24/10/2007,,8517,8779,8468,8710
    23/10/2007,,8577,8679,8482,8527
    22/10/2007,,8886,8886,8617,8756
    19/10/2007,,8974,9007,8786,8860
    Не надо
    2007/10/24...

  8. #8
    Администратор, Консультант по математике
      За вклад в развитие форума 2006, Лучший знаток физики 2007, Самый активный автор месяца. Август 2007, Лучший консультант 2007, Лучший супермодератор 2007, Народный модератор раздела "Наука и Образование" 2008, Лучший супермодератор 2008, Лучший консультант 2008
    Аватар для Trotil
    Регистрация
    15.12.2005
    Адрес
    град Москва
    Сообщений
    5,890
    Записей в блоге
    26
    Спасибо
    я - 57; мне - 380
    Ilya Skuratov
    Брр... Чего-то ты сам запутался

    Тогда программа такая:

    PHP код:
    <?php 
    $a
    =file_get_contents("123.csv");     
    $pattern "/(\d+)\/(\d+)\/(\d+),,/";
    $replacement "$3/$1/$2,,";
    echo 
    preg_replace($pattern$replacement$a);
    echo 
    $a;
    ?>
    Вывело:

    2007/10/25,,8763,9052,8754,9046
    2007/10/24,,8517,8779,8468,8710
    2007/10/23,,8577,8679,8482,8527
    2007/10/22,,8886,8886,8617,8756
    2007/10/19,,8974,9007,8786,8860
    Если четырех последних чисел не надо, тогда вот такая:

    Программа:
    PHP код:
    <?php 
    $a
    =file_get_contents("123.csv");     
    $pattern "/(\d+)\/(\d+)\/(\d+),,(\d+),(\d+),(\d+),(\d+)/";
    $replacement "$3/$1/$2";
    echo 
    preg_replace($pattern$replacement$a);
    echo 
    $a;
    ?>
    Выводит:
    2007/10/25
    2007/10/24
    2007/10/23
    2007/10/22
    2007/10/19
    Ленивый дурак - это полбеды; деятельный дурак - это для всех головная боль, но нет ничего хуже, чем дурак с инициативой, да ещё и при должности.

  9. #9
    Администратор, Консультант по математике
      За вклад в развитие форума 2006, Лучший знаток физики 2007, Самый активный автор месяца. Август 2007, Лучший консультант 2007, Лучший супермодератор 2007, Народный модератор раздела "Наука и Образование" 2008, Лучший супермодератор 2008, Лучший консультант 2008
    Аватар для Trotil
    Регистрация
    15.12.2005
    Адрес
    град Москва
    Сообщений
    5,890
    Записей в блоге
    26
    Спасибо
    я - 57; мне - 380
    Добавление: замена с помощью регулярных выражений встроена в некоторые текстовые редакторы.

    В частности, мой уважаемый Notepad++.

    Там:

    1) Открываем 123.csv
    2) Меню Поиск -> Замена...
    3) Отмечаем галочкой пункт "Регулярное выражение"
    4) В ячейку "что искать" пишем (\d+)\/(\d+)\/(\d+)
    5) В ячейку "Заменить на" пишем \3/\1/\2
    Получаем требуемый результат.

    Немного о том, это за строка поиска такая.

    Нам требуется найти все подстроки вида: [число] [символ "/"] [число] [символ "/"] [число]
    На языке регулярных выражений это запишется так:
    \d - цифра
    (\d+) - модификатор "+" означает "одна и более"
    \/ - символ "/" (символ "/" является служебным, поэтому если мы просто напишем
    (\d+)/(\d+)/(\d+) - это вызовет ошибку (например, в php). Необходимо его экранировать символом "\")

    (\d+)\/(\d+)\/(\d+) - одна и более цифр, символ "/", одна и более цифр, символ "/", одна и более цифр

    Вот и вся премудрость.
    Ленивый дурак - это полбеды; деятельный дурак - это для всех головная боль, но нет ничего хуже, чем дурак с инициативой, да ещё и при должности.

  10. #10
    Фотограф Аватар для Ilya Skuratov
    Регистрация
    11.03.2004
    Сообщений
    492
    Спасибо
    я - 0; мне - 4
    Trotil
    Спасибо, завтра доложу о результататх

  11. #11
    Фотограф Аватар для Ilya Skuratov
    Регистрация
    11.03.2004
    Сообщений
    492
    Спасибо
    я - 0; мне - 4
    что то не так?

  12. #12
    Администратор, Консультант по математике
      За вклад в развитие форума 2006, Лучший знаток физики 2007, Самый активный автор месяца. Август 2007, Лучший консультант 2007, Лучший супермодератор 2007, Народный модератор раздела "Наука и Образование" 2008, Лучший супермодератор 2008, Лучший консультант 2008
    Аватар для Trotil
    Регистрация
    15.12.2005
    Адрес
    град Москва
    Сообщений
    5,890
    Записей в блоге
    26
    Спасибо
    я - 57; мне - 380
    не выполнен пункт 3:

    3) Отмечаем галочкой пункт "Регулярное выражение"
    Ленивый дурак - это полбеды; деятельный дурак - это для всех головная боль, но нет ничего хуже, чем дурак с инициативой, да ещё и при должности.

  13. #13
    Фотограф Аватар для Ilya Skuratov
    Регистрация
    11.03.2004
    Сообщений
    492
    Спасибо
    я - 0; мне - 4
    Trotil
    Огромное спасибо за помощь, очень пригодилось, скачал себе блокнотик.!

  14. #14
    Фотограф Аватар для Ilya Skuratov
    Регистрация
    11.03.2004
    Сообщений
    492
    Спасибо
    я - 0; мне - 4
    Trotil
    Оечередной вопрос.
    Ребята помогите разобраться, что за ошибку выдает скрипт:
    PHP код:
    Opt("SendKeyDelay"50);
    Opt("WinTitleMatchMode"2);
    $count 0;

    While 
    1
    $lastdate 
    "03/30/2007";        Это дата самой свежей котировкиподлежащей граблению (формат MM/DD/YYYY).



    $count $count 1
    $line 
    StringSplit(FileReadLine(@ScriptDir "\datagrabber.task"$count), ",;"&@TAB);
    If @
    error <> 0 Then Exit;

    $symbol $line[1];
    $period StringUpper($line[2]);
    If 
    $period == "D" Then
        $firstdate 
    "02/01/2007"
    Else
        
    $firstdate "02/01/2007"
    EndIf                  

    DirCreate(@ScriptDir "\" & @YEAR & @MON & @MDAY);
    $out = @ScriptDir & "\" & @YEAR & @MON & @MDAY & "\" & $symbol & "_" & $period & ".csv";

    WinWaitActive("
    P018 Romank");
    Sleep(2000);
    Send(StringLower(
    $symbol &","& $period &"{ENTER}"));
    Sleep(300);
    If StringInStr(WinGetText("
    P018 Romank"), "not found") Then
        Sleep(5000);
        ContinueLoop;        Contract '' not found.
    EndIf;

    ; начальная подготовка
    MouseClick("", 1018, 709);
    Sleep(5000);
    MouseClick("
    right", 451, 709, 2);
    MouseClick("", 413, 486);

    ; установка временной шкалы на последний день
    MouseClick("
    right", 451, 709, 2);
    MouseClick("", 413, 443);
    WinWaitActive("
    Go To Date:");
    $date = StringSplit($lastdate, "/")
    Opt("
    MouseCoordMode", 0);
    MouseClick("", 33, 38, 1, 5);
    Send(
    $date[1]);
    MouseClick("", 52, 38, 1, 5);
    Send(
    $date[2]);
    MouseClick("", 76, 38, 1, 5);
    Send(
    $date[3]);
    MouseClick("", 163, 38, 1, 5);
    Sleep(5000);


    While DateRange(
    $firstdate$lastdate)
    WinWaitActive("
    P018 Romank");
    Sleep(1000);

    Opt("
    MouseCoordMode", 1);

    WinMenuSelectItem("","","
    P&rint","Tabular Display");
    Sleep(1000);
    Send("
    {TAB}{DOWN}");

    For 
    $i = 0 To 3
        Send("
    +^{RIGHT}+{PGDN 8}^c{DOWN}^{LEFT}");
        FileWriteLine(
    $out, StringReplace(StringReplace(ClipGet(), @TAB, ","), " ", ""));
    Next;

    Send("
    +^{RIGHT}+^{LEFT}^c^{F4}");
    $lastdate = StringStripWS(ClipGet(), 8);

    MouseClickDrag("", 120, 520, 520, 520, 30);

    WEnd;
    WEnd;

    Func DateRange(
    $date1$date2)
        
    $date1 = StringSplit($date1, "/");
        
    $date2 = StringSplit($date2, "/");
        If 
    $date1[3] > $date2[3] Then Return 0;
        If 
    $date1[3] < $date2[3] Then Return 1;
        If 
    $date1[1] > $date2[1] Then Return 0;
        If 
    $date1[1] < $date2[1] Then Return 1;
        If 
    $date1[3] > $date2[2] Then Return 0;
        If 
    $date1[2] < $date2[2] Then Return 1;
        Return 0;
    EndFunc; 
    Писал его не я, я и не умею, а тот кто писал не найдешь уже.
    Так вот скрипт выполняет следующее, он имитирует клики мышью, работает с графиком, собирает с графика данные, кладет их в файлик CSV.
    Спасибо.
    Последний раз редактировалось Дюкаша; 25.05.2022 в 17:36.

  15. #15
    Администратор, Консультант по математике
      За вклад в развитие форума 2006, Лучший знаток физики 2007, Самый активный автор месяца. Август 2007, Лучший консультант 2007, Лучший супермодератор 2007, Народный модератор раздела "Наука и Образование" 2008, Лучший супермодератор 2008, Лучший консультант 2008
    Аватар для Trotil
    Регистрация
    15.12.2005
    Адрес
    град Москва
    Сообщений
    5,890
    Записей в блоге
    26
    Спасибо
    я - 57; мне - 380
    Че за язык хоть? Visual Basic?
    Я с таким языком не знаком, к сожалению, поэтому советы могу дать только на интуитивном уровне..

    Скорей всего $date1[3] (и 1, 2) у тебя в строковом формате, а нужно в числовом (не знаю, как VB к этому относится)

    Неплохо бы отладить и посмотреть, а что там вообще.

    alert($date1[3]); ЧТо выведет?

    все строчки вставлять перед If $date1[3] > $date2[3] Then Return 0;
    Ленивый дурак - это полбеды; деятельный дурак - это для всех головная боль, но нет ничего хуже, чем дурак с инициативой, да ещё и при должности.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Ответов: 15
    Последнее сообщение: 19.06.2005, 12:44

Ваши права

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