2016-06-25 61 views
1

我試圖從5個文件中生成視頻站點地圖,其中有不同部分的站點地圖信息。我想出的唯一方法是在每個文件的循環中跳過1行,然後在目標文件中添加下一行,但是這需要很長時間才能完成(超過10分鐘),因爲每行超過3千行文件。每個文件中的所有行都排列在一起,因此必須根據行號「組合」在一起。更有效的方式從多個文件中逐行取出行,並在powershell中編寫新文件

這裏是我使用的代碼:

# Count Number Of Lines 
$NumberOfVideos = 0 
Get-Content "c:/list_of_links_with_YT_video.txt" |%{ $NumberOfVideos++ } 

# Add lines to the sitemap 1 by 1 
For($i=1;$i -le $NumberOfVideos;$i++){ 
    ' <url>' | Add-Content $outputfolder\videositemap.xml 
    Get-Content "c:/list_of_links_with_YT_video.txt" | select -first 1 -skip $i | Add-Content $outputfolder\videositemap.xml 
    " <video:video>" | Add-Content $outputfolder\videositemap.xml 
    Get-Content "c:/listof_YT_Embeds.txt" | select -first 1 -skip $i | Add-Content $outputfolder\videositemap.xml 
    Get-Content "c:/listof_YT_Thumbnailss.txt" | select -first 1 -skip $i | Add-Content $outputfolder\videositemap.xml 
    Get-Content "c:/list_of_video_sitemap_titles.txt" | select -first 1 -skip $i | Add-Content $outputfolder\videositemap.xml 
    Get-Content "c:/list_of_video_sitemap_descriptions.txt" | select -first 1 -skip $i | Add-Content $outputfolder\videositemap.xml 
    ' </video:video> 
</url>' | Add-Content $outputfolder\videositemap.xml 
} 

# Add last line to the sitemap 
"</urlset>" | Add-Content $outputfolder\videositemap.xml 

這是在站點地圖文件內容後1個循環的例子:

<url> 
<loc>http://mywebsite.com/page-example.html</loc> 
    <video:video> 
    <video:player_loc allow_embed="yes" autoplay="autoplay=1">http://www.youtube.com/v/xu3Je-eJgbR</video:player_loc> 
    <video:thumbnail_loc>http://img.youtube.com/vi/xu3Je-eJgbR/1.jpg</video:thumbnail_loc> 
    <video:title>Example Title Extracted From a HTML File</video:title> 
    <video:description>Example Description Extracted From A HTML File</video:description> 
</video:video> 
</url> 

有一些更好的方式來構成1個文件出多個文件?

回答

1
  1. 輸入文件的內容從未改變,所以使用Get-Content一旦每個文件
  2. Get-Content回報集合與Count財產
  3. 輸出文件永遠不會改變,將其存儲在一個變量
  4. Join-Path是一個很好的練習(而不是"$path\$filename"
  5. 我不習慣Add-Content,所以我用Out-File -Append,但我想這只是一個味道的問題

這將產生你想要什麼:

$file1Lines = Get-Content "c:/list_of_links_with_YT_video.txt" 
$file2lines = Get-Content "c:/listof_YT_Embeds.txt" 
$file3lines = Get-Content "c:/listof_YT_Thumbnailss.txt" 
$file4lines = Get-Content "c:/list_of_video_sitemap_titles.txt" 
$file5lines = Get-Content "c:/list_of_video_sitemap_descriptions.txt" 

$videoCount = ($file1Lines).Count 
$outputFile = Join-Path $outputfolder "videositemap.xml" 

#thought this was missing 
"<urlset>" | Out-File $outputFile -Append 

for($i = 1; $i -le $videoCount; $i++) { 

#no indentation here to avoid indentation in the output string 
" <url> 
    $($file1Lines[$i]) 
    <video:video> 
    $($file2Lines[$i]) 
    $($file3Lines[$i]) 
    $($file4Lines[$i]) 
    $($file5Lines[$i]) 
    </video:video> 
</url>" | Out-File $outputFile -Append 

} 

"</urlset>" | Out-File $outputFile -Append 

我很好奇,看看速度的提升。

編輯:你的源文件中有雙引號,我希望這不會破壞我的腳本:)

+0

哇,你是我的朋友!您的代碼需要大約4秒鐘才能完成!非常感謝! –