2017-09-05 72 views
-1

我們每天向供應商提供一個整合的.csv文件,其中包含銷售訂單。由於我們在第四季度的基礎設施發生了變化,我們正在失去管理這種整合的應用程序,並且需要以某種方式手動開發。從.txt文件提取數據以使用powershell填充.csv文件

我們從tt文件中獲得訂單,但實際上看起來像.csv。文件看起來像這樣

 
OR,00000330,9217,,20170904,, 
,AG147,,,3.25,,1 
,AG161,,,2.69,,2 
,AG001,,,2,,2 
,AG004,,,2,,2 
,AG005,,,1.9,,2 
,AG008,,,1.9,,2 
,AG009,,,1.9,,2 
,AG010,,,2.03,,2 
,AG011,,,1.9,,2 
,AG012,,,1.9,,2 
,AG013,,,2.35,,2 
,AG014,,,2.35,,2 
,AG015,,,2.35,,2 
,AG016,,,2.11,,2 

我需要從這些文件中(不是所有的文件都包含相同的數據)提取:

  • 9217 - 獨特的貯存標識符
  • 20170904 - 交貨日期
  • AGXXX - 產品編號
  • 最後價值 - 產品數量

正如您從文件中看到的那樣,它不會顯示標題或列名稱。我已經遇到了一些問題。

就最終的.csv文件需要的樣子而言,這裏是一個示例。我已經在標題中手動編輯過,同樣,這個文件沒有標題信息。

 
SiteCode SiteName Address2 Address3 County PostCode Contactno ? Product Quantity ? ProuctCode TransactionDate DeliveryDate 
7001 Site 10 Big Street The Big Street Co.County XXX-XXX 123456 1840246 ABC123 4 77168 Chicken Stuffing WB 01/08/2017 03/08/2017 

「?」標題表示我正在等待確認它們的列。

因此很顯然,在銷售訂單中沒有包含大量csv。

  • SITECODE - 這是在銷售訂單
  • 網址 - 我知道這一點,我可以有代碼的腳本,當SITECODE = X,則網站名稱= Y?
  • 地址 - 我會知道這一點,我可以在腳本中的代碼,當SiteCode = x,然後地址lines = y?
  • 縣 - 同上
  • 郵編 - 同上
  • Contactno - 同上
  • H列未知 - 需要找出這個值是
  • 產品代碼 - 需要提取和填充來自銷售訂單
  • 數量 - 需要從銷售訂單中提取和填充
  • 列K未知 - 授予的值每行都相同。我可以爲每行定義插入此列的值嗎?
  • ProductName - 不在銷售文件中,但我知道名稱。我可以通過PowerShell從數據庫中獲取該數據,還是可以在腳本中定義數據?當ProductCode = X時 - PRoductName = Y?
  • TransactionDate - 這是訂單發出的日期。它在文件名中,我可以從文件名中提取填充列嗎?
  • DeliveryDate - 這是在銷售訂單,在第一行

將不勝感激幫助這裏的傢伙。有些部分我正在工作,但正在努力讓數據提取在這裏工作。

+0

當然,有可能查找第一行和後面的信息不同。但唯一確定其來源和意義的人就是你。[SO]不是一個腳本寫作服務,所以你認爲誰會比你自己更努力? – LotPings

+0

嗨很多,我很清楚在這裏問一個問題,因爲我不知道答案。對於像這樣的網站如何運作,並不需要很好的解釋或解釋,我爲很多人貢獻了很多。 – Daniel

回答

2

本質上,它看起來像你有一堆帶逗號分隔值的文件(但不是真正的CSV,因爲第一行的數據不是標題,也不同於其餘數據),並且想要將其導出爲TSV(製表符分隔值)文件。

由於您的輸入數據不是真正的CSV我不會打擾Import-Csv。只需將文件作爲文本讀取並拆分行即可。另一個值一個值的

$data = Get-Content 'C:\path\to\input.txt' 

$store, $date = (($data | Select-Object -First 1) -split ',')[2, 4] 

$data | Select-Object -Skip 1 | ForEach-Object { 
    $product, $qty = ($_ -split ',')[1, -1] 
    ... 
} 

查找在PowerShell中通過哈希表通常做:

$sites = @{ 
    'foo' = 'Site A' 
    'bar' = 'Site B' 
    ... 
} 
$sitecode = 'bar' 

$sites[$sitecode] # returns 'Site B' 

哈希表的值並不需要是簡單的字符串,你也可以有嵌套哈希表,數組或其他對象。例如,對於查找地址數據的哈希表看起來是這樣的:

$addresses = @{ 
    'foo' = New-Object -Type PSObject -Property @{ 
     'Address' = 'Runaway Avenue 23' 
     'Country' = 'Greenland' 
     'Postcode' = 12345 
     ... 
    } 
    'bar' = New-Object -Type PSObject -Property @{ 
     ... 
    } 
    ... 
} 

從輸入數據構建定製對象和哈希表:

New-Object -Type PSObject -Property @{ 
    'SiteCode' = $sitecode 
    'SiteName' = $sites[$sitecode] 
    'Address2' = $addresses[$sitecode].Address 
    'Postcode' = $addresses[$sitecode].Postcode 
    ... 
    'Quantity' = $qty 
    ... 
} 

,並通過Export-Csv生成的對象導出到TSV文件:

... | Export-Csv 'C:\path\to\output.csv' -NoType -Delimiter "`t" 
+0

謝謝Ansgar。是的,我剛開始時用腳本將.txt轉換成.csv格式,然後我手動添加了標題,但是我想我陷入了一個我無法從中退出的漏洞。我聽說過哈希表,但沒有深入使用它們。我可能會更詳細地研究它們,這聽起來像我一直在尋找的東西。謝謝 – Daniel

0

要求完成所需的整個腳本是不道德的。所以這裏是什麼讓你走。

當我複製示例數據到一個文件,說,data.txt中讀入一個變量

$Data = get-content C:\Data.txt 

這是一種模式,我注意到 ​​是含有獨特的商店標識符和交付第一線日期 所以$UniqueStoreId = $data[0].Split(",")[2]

$DeliveryDate = ([datetime]::ParseExact($data[0].Split(",")[4],」yyyyMMdd」,$null)).toshortdatestring() 

然後,如果行的總數$Total = $data.Count

迭代for循環中的每一行,如下所示。你將擁有你需要的一切。

For ($I=1; $I -lt $Total; $I++) 
{ 
    $ProductCode = $Data[$I].Split(",")[1] 
    $Quantity = $Data[$I].Split(",")[6] 
} 

創建自定義CSV文件非常簡單。創建一個新的PSObject並添加需要的標題作爲其屬性。對此做一個Export-CSV將產生完美的csv結果。

$CSVobject = [PSCustomObject] @{ 
     Header1 = $null 
     Header2 = $null 
     Header3 = $null 
     #and so on 
    } 

在for循環本身,你提取數據添加到CSVObject像

$CSVObject.Header1 = "xxxx" 
$CSVObject.Header2 = "yyyy" 

運行這件事在循環或但是你想獲得最終的CSV。下面是一個粗略的例子

$FinalCSV = For ($I=1; $I -lt $Total; $I++) 
{ 
    $ProductCode = $Data[$I].Split(",")[1] 
    $Quantity = $Data[$I].Split(",")[6] 

    $CSVobject.Header1 = $ProductCode 
    $CSVObject.Heade2 = "$Quantity" 

    $CSVObject 
} 

最後,做Export-CSV得到你想要的輸出。

+0

謝謝Rohin。我很清楚這種合作/基於社區的平臺如何工作。我不是在尋找任何人爲我完成這項工作,我只是在努力處理沒有頭文件的數據,而且也無法找到信息如何從一個文件中「挑選」我想要的內容填充另一個。正如你所說,你讓我走了,所以謝謝你。 – Daniel

相關問題