使用ForEach循环来反转csv文件

时间:2017-04-06 19:26:56

标签: powershell csv foreach

我需要做的是获取一些文本文件(csv,所有在一个目录中)并创建文件,其中整个输出逐行反转,但保持标题在顶部而不是最终在底部。

我可以获取一个文件(按名称)并复制第一行并创建一个只包含该行的新文件。然后我取原始文件减去第一行,将其读入数组并反转。然后我将它附加到只有标题的文件。它的工作正常,除了输出名称,我想成为[file-REV.csv]但到目前为止我只得[file.csv-REV] ...

所以,一旦我有了这个工作,我认为是时候让程序找到目录中的所有csv并循环遍历它们,为每个创建一个反向文件。

这是我到目前为止所做的:

cd c:\users\$([Environment]::UserName)\working

$Path = "c:\users\$([Environment]::UserName)\working\"

ForEach ($file in Get-ChildItem -Filter *.csv) {
    Get-Content $file  -totalcount 1 | Set-Content .\$file-REV.csv
    $flip = (get-content | select -Skip 1)
    [array]::Reverse($flip)
    $flip | add-content "$file-REV.csv"
 }

以下是执行脚本时收到的消息:

  

命令管道位置1的cmdlet Get-Content

     

提供以下参数的值:

     

路径[0]:

我试图放入整个路径Get-Content -Path c:\users\jmurphy\working\,然后抱怨它无法找到整条路径。

2 个答案:

答案 0 :(得分:1)

夫妻俩。首先,您要定义要在变量中使用的文件夹,因此请在make -p -f/dev/null # or, if you like typing, make --print-data-base -f /dev/null 中使用该文件夹。 (我将名称改为import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D x = np.random.random(10) y = np.random.random(10) z = np.random.random(10) value = np.random.randint(2,size=10) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x[value==0], y[value==0], z[value==0]) plt.show() ,因为Get-ChildItem已经在环境范围内使用了变量。另外$Folder是从环境范围中读取变量的更快捷的方法。)

$Path

其次,您只想使用$env:返回的$Folder = "C:\Users\$env:UserName\working\" $Files = Get-ChildItem $Folder -Filter *.csv 属性,因为这是每个文件的完整路径。

Fullname

因此,您希望在Get-ChildItem

中使用该文件的完整路径
ForEach ($File in $Files) {

并且当您再次致电Get-Content时,您想再次使用Get-Content $File.Fullname -totalcount 1 | Set-Content .\$($file.Basename)-REV.csv 作为文件的路径:

$File

Get-Content是来自$Flip = (Get-Content $File.Fullname | Select -Skip 1) 的属性,只有没有扩展名的文件名。您可以通过括在Basename中来强制在双引号内对变量的属性进行求值。

Get-Childitem

所有脚本应该如下所示:

$()

答案 1 :(得分:0)

Joe,你在学习PowerShell方面做得很好。你只需要更多地利用面向对象的力量。

您已经知道Get-ChildItem将返回有关文件的对象。您需要知道的是该对象中包含的成员。使用Get-Member找到它。

$file = Get-ChildItem .\t.csv
$file | Get-Member

找到有趣的成员后,请查看它的价值。

$file.Name
$file.Extension
$file.BaseName

由此,您可以构建一个新文件名。

$newFilename = $file.Basename + '-REV' + $file.Extension

将此内容放在Get-Content行之前。然后将$ newFilename与Add-Content一起使用。