2017-09-05 54 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