2017-05-25 66 views
0

我正在尋找Powershell,vbscript或Excel VBA中腳本形式的Excel公式轉換。我試圖獲得列標題列表和它下面的字符串的最大長度。列出列標題並獲取每列的最大字符串長度

通常情況下,我做的是手動在Excel中打開.txt文件,從那裏我能得到頭名。接下來,我創建一個數組公式= MAX(LEN(A1:A100,000))例如。這將獲得列中字符串的最大長度。我會對其他欄執行相同的公式。

現在我無法做到這一點,因爲文件已增加到1GB的大小,我無法再打開它們,我的桌面崩潰了。這也可能是因爲它們超過100萬行Excel無法處理。我的朋友建議Powershell,但我知識有限..不知道它是否可以在vbscript或Excel VBA中完成。

在此先感謝您的幫助。

下面的代碼適用的.csv文件,但不與.TXT分隔的文件 -

$fileName = "C:\Desktop\EFile.csv" 
<# 
Sample format of c:\temp\data.csv 
"id","name","grade","address" 
"1","John","Grade-9","test1" 
"2","Ben","Grade-9","test12222" 
"3","Cathy","Grade-9","test134343" 
#> 
$colCount = (Import-Csv $fileName | Get-Member | Where-Object {$_.MemberType -eq 'NoteProperty'} | Measure-Object).Count 
$csv = Import-Csv $fileName 
$csvHeaders = ($csv | Get-Member -MemberType NoteProperty).name 

$dict = @{} 
foreach($header in $csvHeaders) { 
    $dict.Add($header,0) 
    } 

foreach($row in $csv) 
{ 
    foreach($header in $csvHeaders) 
    { 
     if($dict[$header] -le ($row.$header).Length) 
     { 
      $dict[$header] =($row.$header).Length 
     } 
    } 
} 
$dict.Keys | % { "key = $_ , Column Length = " + $dict.Item($_) } 
+0

你有什麼試過,你試過的怎麼樣都失敗了?理想情況下,您應該提供您嘗試過的[最小,完整和可驗證的示例](https://stackoverflow.com/help/mcve),幷包含有關失敗的具體信息,包含錯誤消息和/或錯誤的輸出。 SO不是代碼寫入服務;最好的問題是提供有用信息的問題,以便那些回答問題的人可以指導你設計自己的正確答案。參見[如何提出一個好問題](https://stackoverflow.com/help/how-to-ask)。 –

+0

謝謝。我編輯我的文章,我以前在Excel中執行它..我打開.txt文件,獲取標題名稱並插入公式。但是,自從Excel崩潰後,我不能再這樣做了,可能是由於超過100萬行記錄。我的桌面最終崩潰。 –

+0

請將您的代碼精簡至儘可能最小的示例,以說明您的問題並在此處發佈代碼。我們很樂意提供幫助,只要我們知道您正在使用的確切代碼,而不必問幾十個問題。 – PeterT

回答

0

這是我如何得到我的數據。

$data = @" 
"id","name","grade","address" 
"1","John","Grade-9","test1" 
"2","Ben","Grade-9","test12222" 
"3","Cathy","Grade-9","test134343" 
"@ 
$csv = ConvertFrom-Csv -Delimiter ',' $data 

但你應該得到這樣的數據該

$fileName = "C:\Desktop\EFile.csv" 
$csv = Import-Csv -Path $fileName 

然後

# Extract the header names 
$headers = $csv | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name 

# Capture output in $result variable 
$result = foreach($header in $headers) { 

    #     Select all items in $header column,  find the longest,   and select the item for output 
    $maximum = $csv | Select-Object -ExpandProperty $header | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum 

    # Generate new object holding the information. 
    # This will end up in $results 
    [pscustomobject]@{ 
     Header = $header 
     Max = $maximum.Length 
     String = $maximum 
    } 
} 


# Simple output 
$result | Format-Table 

這就是我得到:

Header Max String  
------ --- ------  
address 10 test134343 
grade  7 Grade-9 
id  1 3   
name  4 John  

另外,如果你有記憶處理大文件的問題,你可能有o使用.NET框架會變得更加骯髒。這段代碼一次處理一條csv行,而不是將整個文件讀入內存。

$fileName = "$env:TEMP\test.csv" 
$delimiter = ',' 

# Open a StreamReader 
$reader = [System.IO.File]::OpenText($fileName) 

# Read the headers and turn it into an array, and trim away any quotes 
$headers = $reader.ReadLine() -split $delimiter | % { $_.Trim('"''') } 

# Prepare a hashtable for the results 
$result = @{} 

# So long as there's more data, keep running 
while(-not $reader.EndOfStream) { 

    # Read a single line and process it as csv 
    $csv = $reader.ReadLine() | ConvertFrom-Csv -Header $headers -Delimiter $delimiter 

    # Determine if the item in the result hashtable is smaller than the current, using the header as a key 
    foreach($header in $headers) { 
     $item = $csv | Select-Object -ExpandProperty $header 

     if($result[$header].Maximum -lt $item.Length) { 
      $result[$header] = [pscustomobject]@{ 
       Header = $header 
       Maximum = $item.Length 
       String = $item 
      } 
     } 
    } 
} 

# Clean up our spent resource 
$reader.Close() 

# Simple output 
$result.Values | Format-Table 
相關問題