bdill icon

azure_blob_iterate_to_csv_files.ps1

bdill | PRO | 08/16/25 09:44:05 PM UTC (Edited) | 0 ⭐ | 8207 👁️ | Never ⏰ | [blob, files, iterate]
PowerShell |

2.8 KB

|

Source Code

|

0 👍

/

0 👎

# Desc: Connect to a SAS URL blob container and iterate through all the files.
#       Saves a numbered csv file for each 5000 files.  Easy on RAM even for containers with millions of files
#       CSV file contains: FileName, FilePath, FileSizeBytes
# ================================
# Settings
# ================================
Clear-Host
$containerSasUrl = "https://my-storage-acct.blob.core.windows.net/my-container?sp=rl&st=2025-08-13T19:48:50Z&se=2025-08-22T04:03:50Z&spr=https&sv=2024-11-04&sr=c&sig=***********"
$outputDir       = "C:\logs"
$chunkSize       = 5000
 
# ================================
# Vars
# ================================
$chunkIndex      = 1
$rowBuffer       = @()
$marker          = ""
$totalCount      = 0
# ================================
 
$StartDate = Get-Date
Write-Host "Started: $(($StartDate).ToString('yyyy-MM-dd HH:mm:ss'))"
 
# Ensure output directory exists
if (-not (Test-Path $outputDir)) { New-Item -Path $outputDir -ItemType Directory | Out-Null }
 
do {
    $url = "$containerSasUrl&restype=container&comp=list&maxresults=5000"
    if ($marker) { $url += "&marker=$marker" }
 
    Write-Host "Getting chunk $chunkIndex with marker: $marker"
    # Use Invoke-WebRequest to get raw content
    $rawContent = (Invoke-WebRequest -Uri $url -UseBasicParsing).Content
    $cleanXml = $rawContent -replace "^[^\<]+",""    # Strip any junk characters before <?xml
    [xml]$xml = $cleanXml
 
    foreach ($blob in $xml.EnumerationResults.Blobs.Blob) {
        $fileName = $blob.Name.Split('/')[-1]
        $filePath = ($blob.Name -replace "/$fileName$","")
        $fileSize = [int64]$blob.Properties."Content-Length"
 
        $rowBuffer += [PSCustomObject]@{
            FileName      = $fileName
            FilePath      = $filePath
            FileSizeBytes = $fileSize
        }
        $totalCount++
 
        if ($rowBuffer.Count -ge $chunkSize) {
            $chunkFile = Join-Path $outputDir ("files_{0:D4}.csv" -f $chunkIndex)
            $rowBuffer | Export-Csv -Path $chunkFile -NoTypeInformation
            Write-Host "Wrote chunk $chunkIndex with $($rowBuffer.Count) rows. Total: $totalCount"
            $chunkIndex++
            $rowBuffer = @()
        }
    }
 
    $marker = $xml.EnumerationResults.NextMarker  # Update marker for next page
} while ($marker -ne "")
 
# Write any remaining rows
if ($rowBuffer.Count -gt 0) {
    $chunkFile = Join-Path $outputDir ("files_{0:D4}.csv" -f $chunkIndex)
    $rowBuffer | Export-Csv -Path $chunkFile -NoTypeInformation
    Write-Host "Wrote final chunk $chunkIndex with $($rowBuffer.Count) rows. Total: $totalCount"
}
 
Write-Host "Done! CSVs saved to $outputDir"
 
$ts = (Get-Date) - $StartDate
Write-Host "Finished: $((Get-Date).ToString('yyyy-MM-dd HH:mm:ss'))"
Write-Host "Elapsesd time: $ts"
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎