2011-03-31 5 views
1

배치에서 powershell로 이동하기로 결정했습니다 (배치는 WMI와는 많이 다르지만 계속 이동해야한다고 결정했습니다).Powershell은 파싱 된 파일에서 배열을 채 웁니다.

문제는 배열이 배치에 존재하지 않으며 토큰 변수에 불과하다는 것입니다. 그래서 나는 그 (것)들에 좀 박제가있다.

아직도

코드의 조각이 잘 작동하는지
$Htm = dir *.htm | foreach {Get-Content $_.FullName} | Select-String sell,buy,s/l,t/p,modify | Select-String -NotMatch MM,== | ForEach { 
$Type = [regex]::split($_,'<.*?>') 
} 

그러나이 모든 단일 분할로 $ 유형을 채우고, 예상대로 의심의 여지. 내가 달성하기를 원하는 것은 배열에 넣을 각 줄의 특정 토큰 값이었습니다.

그래서 $ Htm 변수의 각 줄/개체에서 여섯 번째 토큰이 필요하므로이 방법을 시도했습니다.

$Htm = dir *.htm | foreach {Get-Content $_.FullName} | Select-String sell,buy,s/l,t/p,modify | Select-String -NotMatch MM,== | ForEach { 
$Type = [regex]::split($_,'<.*?>')[6] 
} 

그러나 이것은 모든 행이 아니라 첫 번째 행에서 6 번째 토큰만을 제공합니다. 이것을 일괄 적으로 수행하는 것은 완전히 for 루프로 작동함으로써 달성 될 수 있습니다. for 루프를 솔직히하기 때문에 일을하는 습관을 벗어나고 싶었습니다.

도움을 주시면 감사하겠습니다.

+0

딱 한 주 :

는 얼마 전에 나는 약 How PowerShell can help programmers 내가 아주 성공적으로 사용 :이 질문의 답의 개수가 표시됩니다

빠른 예를 기능 Convert-Html2Xml을 보여 곳 썼다 PowerShell의 초보자는 여기 에서처럼 문자열로 모든 것을 처리하는 경향이 있지만 사실 Get-Content에'$ _. FullName '을 전달할 필요가 없으므로'$ _'는 파일을 나타내는 객체이므로 충분합니다. 또한'Get-Content'는 파일 이름을 파이프 라인에서 직접 취할 수 있으므로'gci * .htm | gc' 충분합니다. ForEach-Object가 필요 없습니다. – Joey

+0

예를 들어 htm을 넣어서 무엇을 갖고 있고 무엇이 정말로 필요한지 알아 보려면 – mjsr

답변

0

그래서 여기가 $의 값입니다 htm과 [1]

<tr bgcolor="#E0E0E0" align=right><td>2</td><td class=msdate>2008.08.06 02:45</td><td>modify</td><td>1</td><td class=mspt>0.10</td><td style="mso-numb 
er-format:0\.00000;">1.54650</td><td style="mso-number-format:0\.00000;" align=right>1.56250</td><td style="mso-number-format:0\.00000;" align=right>1 
.54380</td><td colspan=2></td></tr> 

나는 모든 태그를 제거하는 데 사용하는 정규식 :: 분할 그래서 <. *?> 기본적으로 제거되고 난 데이터 왼쪽 해요 나는 실제로 필요하다.

2 2008년 8월 6일 2시 45분 토큰은 모든 라인에 대해 동일하므로 1 0.10 1.54650 1.56250 1.54380

파싱 HTML 파일은 수정 테이블이다.

다시 한 번 문제는 변수에 토큰을 할당하려고 할 때 "각 행의 토큰 6이 배열로 이동"하지 않는다는 것입니다. 발견 된 마지막 값만 지정합니다.

글을 쓰는 것은 당연히 내가 문제를 알고 있지만 그것을 고치는 방법에 대해서는 생각하지 못한다고 생각하게 만듭니다.

0

다음은 IRC에서 채팅 후 실행 가능한 코드입니다.

$Htm = dir *.htm | Select-String sell,buy,s/l,t/p,modify | 
    Select-String -NotMatch MM,== | ForEach-Object { 
     $Tokens = [regex]::split($_,'<.*?>') 
     New-Object PSObject -Property @{ 
      Action = $Tokens[6] 
      LotSize = [int]$Tokens[8] 
      OpenPrice = [decimal]$Tokens[10] 
     } 
} 
+0

@Jaykul처럼 IRC (SO 대신)에서 살고 있습니까?:) – stej

+0

그래, 그런 것. – JasonMArcher

0

나는 당신이 HTML을 분석하려고하는 것을 본다. html을 xml로 변환하고 xpath 또는 simple을 사용하는 것을 고려 했습니까 dot 접근 방식?

[7]: [xml]$x = download-page http://stackoverflow.com/questions/5506691/powershell-populate-array-from-parsed-file 
Cannot convert value "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
<title>Powershell populate array from parsed file - Stack Overflow</title> 
.... 
[8]: $x = Convert-html2Xml (download-page http://stackoverflow.com/questions/5506691/powershell-populate-array-from-parsed-file) 
[9]: $x | 
>> Select-Xml -XPath "//div[contains(@class, 'answers-subheader')]/h2" | 
>> Select -expand Node | 
>> Select -expand '#text' 
>> 
3 Answers 
관련 문제