Показать полную графическую версию : [решено] Выделить из строки текста слово определенной длины и записать в переменную
Grafitchic
15-07-2014, 14:20
здравствуйте!
есть задача загрузить через powershell файл и преобразовать его в csv вида:
N;C1;C7;C30;C90;C180;C360
1; 7.28; 7.54; 8.05; 8.58; 8.93; 9.19
2….
сам файл имеет примерно такую структуру:
<Record Code="1" Date="07/07/2014"><C1>7.28</C1><C7>7.54</C7><C30>8.05</C30><C90>8.58</C90><C180>8.93</C180><C360>9.19</C360></Record>
<Record Code="2" Date="07/07/2014"><C1>7.89</C1><C7>8.22</C7><C30>9.00</C30><C90>9.41</C90><C180>9.81</C180><C360>10.19</C360>></Record>
возник вопрос: как из строки выделить номер кода (code="1"), значения между <C1>...</C1> и вывести их в csv с заданным видом
Приведите полный формат файла, возможно это xml.
[xml]$xml = @"
<?xml version="1.0"?>
<Records>
<Record Code="1" Date="07/07/2014"><C1>7.28</C1><C7>7.54</C7><C30>8.05</C30><C90>8.58</C90><C180>8.93</C180><C360>9.19</C360></Record>
<Record Code="2" Date="07/07/2014"><C1>7.89</C1><C7>8.22</C7><C30>9.00</C30><C90>9.41</C90><C180>9.81</C180><C360>10.19</C360>></Record>
</Records>
"@
PS > $xml.Records.Record
Code : 1
Date : 07/07/2014
C1 : 7.28
C7 : 7.54
C30 : 8.05
C90 : 8.58
C180 : 8.93
C360 : 9.19
Code : 2
Date : 07/07/2014
C1 : 7.89
C7 : 8.22
C30 : 9.00
C90 : 9.41
C180 : 9.81
C360 : 10.19
#text : >
PS > $xml.Records.Record | convertto-csv -Delimiter ";" -NoTypeInformation
"Code";"Date";"C1";"C7";"C30";"C90";"C180";"C360"
"1";"07/07/2014";"7.28";"7.54";"8.05";"8.58";"8.93";"9.19"
"2";"07/07/2014";"7.89";"8.22";"9.00";"9.41";"9.81";"10.19"
Grafitchic
15-07-2014, 14:44
так и есть, это xml-файл
<?xml version="1.0" encoding="windows-1251" ?>
----------------------------------------------
<MKR FromDate="20140707" ToDate="20140707" name="Interbank Credit Market">
<Record Date="07/07/2014" Code="1" >
<C1>7.28</C1>
<C7>7.54</C7>
<C30>8.05</C30>
<C90>8.58</C90>
<C180>8.93</C180>
<C360>9.19</C360>
</Record>
<Record Date="07/07/2014" Code="2" >
<C1>7.89</C1>
<C7>8.22</C7>
<C30>9.00</C30>
<C90>9.41</C90>
<C180>9.81</C180>
<C360>10.19</C360>
</Record>
<Record Date="07/07/2014" Code="3" >
<C1>7.75</C1>
<C7>10.07</C7>
<C30>8.25</C30>
<C90>10.58</C90>
<C180>9.82</C180>
<C360>10.15</C360>
</Record>
<Record Date="07/07/2014" Code="4" >
<C1>7.68</C1>
<C7>-</C7>
<C30>-</C30>
<C90>-</C90>
<C180>-</C180>
<C360>-</C360>
</Record>
<Record Date="07/07/2014" Code="5" >
<C1>180659.39</C1>
<C7>317.60</C7>
<C30>5.20</C30>
<C90>300.00</C90>
<C180>2160.00</C180>
<C360>480.00</C360>
</Record>
<Record Date="07/07/2014" Code="6" >
<C1>48704.00</C1>
<C7>-</C7>
<C30>-</C30>
<C90>-</C90>
<C180>-</C180>
<C360>-</C360>
</Record>
<Record Date="07/07/2014" Code="7" >
<C1>7.81</C1>
<C7>12.00</C7>
<C30>-</C30>
<C90>-</C90>
<C180>-</C180>
<C360>-</C360>
</Record>
<Record Date="07/07/2014" Code="8" >
<C1>15228.80</C1>
<C7>160.00</C7>
<C30>-</C30>
<C90>-</C90>
<C180>-</C180>
<C360>-</C360>
</Record>
</MKR>
[xml](Get-Content file.xml) | Foreach {$_.MKR.Record} | Export-Csv -NoTypeInformation -Delimiter ";" result.csv
Только убрать из xml - ----------------------------------------------
Grafitchic
15-07-2014, 14:47
спасибо за помощь!
Grafitchic
15-07-2014, 15:02
есть небольшая проблемка
при сохранении в формате csv итог получается такой:
Date Code C1 C7 C30 C90 C180 C360
07.07.2014 1 июл.28 июл.54 08.май авг.58 авг.93 сен.19
07.07.2014 2 июл.89 авг.22 9.00 сен.41 сен.81 окт.19
07.07.2014 3 июл.75 10.июл авг.25 окт.58 сен.82 окт.15
07.07.2014 4 июл.68 - - - - -
07.07.2014 5 180659.39 317.60 май.20 300.00 2160.00 480.00
07.07.2014 6 48704.00 - - - - -
07.07.2014 7 июл.81 12.00 - - - -
07.07.2014 8 15228.80 160.00 - - - -
вместо значений c1 ... c360 в некоторых местах стоит дата, а остальные значения не совпадают
здесь уже нужно бороться с форматом ячеек в excel?
1) Открываем excel
2) Открыть файл - выбираем csv
3) Запустится мастер текстов
Шаг 1 - Далее
Шаг 2 - выбираем символ - разделителя точка с запятой
Шаг 3 - Выбираем столбец и выставляем тип текстовый, и так для всех столбцов.
http://s29.postimg.org/8q0wmfytf/image.jpg (http://postimg.org/image/8q0wmfytf/)
Grafitchic
15-07-2014, 15:30
при выборе csv, excel сразу открывает его и не вызывает мастер текстов
http://it.kgsu.ru/MSExcel/excel161.html
Grafitchic
15-07-2014, 15:38
всё в порядке, разобрался. kazun, благодарю за помощь.
Grafitchic
16-07-2014, 11:42
пока не закрыли тему задам еще вопрос: можно ли в поле date заносить дату текущего дня, то есть дня, когда скачали этот xml-файл, а не когда он был создан?
допустим, если в переменной $Url = "http://www.cbr.ru/scripts/xml_mkr.asp?date_req1=07/07/2014&date_req2=07/07/2014" поменять ширину даты, допустим с 1.07.14 по 7.07. 14, то он выдает даты создания этих документов. мне же нужно, чтобы он выдавал сегоднешнее число.
$date = (Get-Date).ToString("dd\/MM\/yyyy")
$Url = "http://www.cbr.ru/scripts/xml_mkr.asp?date_req1=$date&date_req2=$date"
Grafitchic
16-07-2014, 12:08
видимо, я немного неправильно выразился.
как я понимаю, при таком добавлении он будет выводить xml-файл созданный этим днем.
я бы хотел скачать файлы за прошлую неделю и указать сегодняшнюю дату их скачивания.
может есть вариант добавить в csv файл еще один столбец с указанием текущей даты?
... Foreach .... | Add-Member -MemberType NoteProperty -Name ToDay -Value (Get-Date).ToString("dd\/MM\/yyyy") -PassThru | Export....
Grafitchic
16-07-2014, 12:23
то, что нужно! на этом всё, не смею больше беспокоить. ещё раз моя тебе благодарность, kazun.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.