• Уважаемый посетитель!!!
    Если Вы уже являетесь зарегистрированным участником проекта "миХей.ру - дискусcионный клуб",
    пожалуйста, восстановите свой пароль самостоятельно, либо свяжитесь с администратором через Телеграм.

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

Ilya Skuratov

Фотограф
Модераторы извините если не сюда запостил.
Возможно ли изменение формата вывода даты?
Подскажите пожалуйста как сделать преобразование записей.
есть файл CSV, в нем 20000 тысяч строк, в каждой строке запись вида:
2007.09.20
2001.10.21
2000.11.22
1999.08.01
и таких строк 20000шт.
нужно поменять на 20.09.2007.
Спасибо.
P.S. Если возможно то чтобы это делал однифайл или что то в этом духе, не знаю как правильно назвать.
 
Все строчки заменить на одну и ту же дату?
Или для каждой строчки своя дата? (что логичнее)
 
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 сделать тем же методом.
 
Спасибо за помощь.
Вот файл примерный, я не стал все 20000 строк выкладывать.
 
В присланном файле дата следующего вида: 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;
?>
 
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
 
Добавление: замена с помощью регулярных выражений встроена в некоторые текстовые редакторы.

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

Там:

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

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

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

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

Вот и вся премудрость.
 
Trotil
Огромное спасибо за помощь, очень пригодилось, скачал себе блокнотик.!
 
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.
Спасибо.
 
Последнее редактирование модератором:
Че за язык хоть? Visual Basic?
Я с таким языком не знаком, к сожалению, поэтому советы могу дать только на интуитивном уровне..

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

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

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

все строчки вставлять перед If $date1[3] > $date2[3] Then Return 0;
 
Что за я зык сказать не могу, т.к. в этом ничего не смыслю, еще раз скажу, что данным скриптом заускались набор кликов и команд, для сбора котировок с графика, т.е. запустив скрипт, можно было просто смотреть киношку на экране и видеть как все работает, не трогая ни в коем случае при этом мышку, кто то в самом источнике поменял какие то настройки программы и теперь скрипт сбивается и не работает
 
Ilya Skuratov написал(а):
кто то в самом источнике поменял какие то настройки программы и теперь скрипт сбивается и не работает

Причина: программа ругается на сравнение If $date1[3] > $date2[3]
- по каким-то причинам не может сравнить, точно сказать не могу, почему именно.
Нужно смотреть на данные, которые сравниваются - что там сидит по факту в этих переменных.
 
Трудно конечно говорить о не известных мне вещах, но скрипт писался на коленке, это точно.
Обратите внимание на эту фразу:
PHP:
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;
Как мне сказали, она отвечает за открытие печатного окна, в котором должен произойти троекратный захват в клипборд строковых данных, но этот захват не происходит.
 
Назад
Сверху