从.txt文件提取数据以使用powershell填充.csv文件

从.txt文件提取数据以使用powershell填充.csv文件,powershell,csv,Powershell,Csv,我们每天向供应商提供一个合并的.csv文件,其中包含销售订单。由于第4季度基础架构发生了已知的变化,我们正在失去管理此整合的应用程序,需要以某种方式手动开发 我们从收银台接收.txt文件中的订单,但它们实际上看起来像.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 ,AG00

我们每天向供应商提供一个合并的.csv文件,其中包含销售订单。由于第4季度基础架构发生了已知的变化,我们正在失去管理此整合的应用程序,需要以某种方式手动开发

我们从收银台接收.txt文件中的订单,但它们实际上看起来像.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 或,000003309217,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 站点代码站点名称地址2地址3县邮政编码联系人号码?产品数量?ProuctCode事务处理日期交货日期 7001现场10大街大街有限公司XXX-XXX 123456 1840246 ABC123 4 77168鸡肉填料WB 01/08/2017 03/08/2017 “?”标题表示我正在等待确认的列

所以很明显,csv中有很多内容没有包含在销售订单中

  • 站点代码-这在销售订单中
  • SiteName-我知道这一点,我可以在脚本中包含代码,当SiteCode=X,然后SiteName=y吗
  • 地址-我会知道这一点,我可以在脚本中有代码,当SiteCode=x时,地址行=y吗
  • 县-同上
  • 邮政编码-同上
  • Contactno-同上
  • H列未知-需要找出此值是多少
  • 产品代码-需要从销售订单中提取和填充
  • 数量-需要从销售订单中提取和填充
  • 列K未知-每行的授予值都相同。我可以为每一行定义要在此列中插入的值吗
  • ProductName-不在销售文件中,但我知道名称。我是否可以通过PowerShell从DB中提取此内容,或者在脚本中定义它?当ProductCode=X时,-PRoductName=Y
  • TransactionDate-这是订单提出的日期。它在文件名中,我可以从文件名中提取以填充列吗
  • 交货日期-这是在销售订单的第一行

非常感谢大家的帮助。我有一些部分正在工作,但正在努力让数据提取在这里工作

从本质上看,您有一堆文件,这些文件的值以逗号分隔(但不是实际的CSV,因为第一行中的数据不是标题,也不同于其他数据),并且希望将其导出为TSV(制表符分隔值)文件

因为您的输入数据不是真正的CSV,所以我不想为导入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
    ...
}
并通过
导出Csv
将生成的对象导出到TSV文件:

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

要求一个完整的脚本做你想要的是不道德的。这就是你要走的路

当我将示例数据复制到一个文件(比如data.txt)并将其读入一个变量时

$Data = get-content C:\Data.txt
这就是我注意到的模式
$Data[0]
是包含唯一门店标识符和交货日期的第一行 所以
$UniqueStoreId=$data[0]。拆分(“,”[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并添加所需的头作为其属性。在此基础上执行
导出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
}

最后,请执行导出CSV以获得所需的输出。

当然,可以查找不同于第一行和第二行的信息。但唯一能确定其来源和意义的人是你。这不是一个脚本编写服务,那么你认为谁会在你的提问中比你自己投入更多的精力呢?嗨,很多人,我显然是在问一个问题,因为我不知道答案。我真的不需要居高临下或解释像这样的网站是如何工作的,我为很多人做了很多贡献。谢谢罗欣。我知道这样的协作/基于社区的平台是如何工作的。我不是在找人帮我做这项工作,我只是在努力处理没有标题的数据,而且也无法找到如何从一个文件中“挑选”我想要的内容以填充到另一个文件中的信息。正如你所说,你让我走了,所以谢谢你,谢谢安斯加。是的,我一开始用脚本将.txt转换成.csv,然后手动添加标题,但我想我陷入了一个无法摆脱的困境。我听说过哈希表,但没有深入使用它们。我可能会更详细地研究它们,这听起来像是我一直在寻找的。谢谢