1

需要帮助从 CSV 文件中删除标题。导入文件的工具有非常严格的要求。第一行必须是Title然后是 row 2 date: 8/19/2019。第三行应该包含没有标题的数据。

尝试将其导入回来并使用 [1..-1] 表示法删除第一行,并尝试使用Select-object -skip 1. 还是不能让它工作。

还尝试将对象数组写入 TXT,但它仅作为字段出现,而不是像在 CSV 中那样基于选项卡。例子:

日期:信息:字段 1:

get-content "c:\users\user123\documents\adh\_$(get-date (get-date).addDays($i) -f yyyy-MM-dd).csv" | Select-Object -Skip 1 | Set-Content "c:\users\user123\documents\adh\_$(get-date (get-date).addDays($i) -f yyyy-MM-dd).txt" 

即使在我尝试删除它们之后,该文件仍然包含标题。

4

5 回答 5

1

给定一个生成的示例文件:

> Get-Content .\_2019-08-19.csv
"COLA","ColB"
"Test1","Foo"
"Test2","Baz"
"Test3","Bar"
"Test4","Baz"
"Test5","Baz"

这个脚本:

## Q:\Test\2019\08\20\SO_SO_57581085.ps1
## 
$i = 1
$BaseDir = 'C:\Users\user123\Documents\adh'
# $BaseDir = (gi .).FullName
$BaseName= '_{0:yyyy-MM-dd}' -f (Get-Date).AddDays(-$i)

"Your Title`ndate: {0:M\/d\/yyyy}" -f (Get-Date).AddDays(-$i) | 
  Set-Content (Join-Path $BaseDir ($BaseName+'.txt')) # -Encoding if req.

Get-Content (Join-Path $BaseDir ($BaseName+'.csv')) | 
  Select-Object -Skip 1 | 
    Add-Content (Join-Path $BaseDir ($BaseName+'.txt')) # -Encoding if req.

产生这个结果文件:

> Get-Content .\_2019-08-19.txt
Your Title
date: 8/19/2019
"Test1","Foo"
"Test2","Baz"
"Test3","Bar"
"Test4","Baz"
"Test5","Baz"
于 2019-08-20T21:23:12.540 回答
1

获取包含字段头记录的 .csv 文件后,即可构建该文件。该csmem.csv文件已生成,但有一个标题记录。这将在前两 (2) 条记录上写入标题和日期,然后附加没有标题记录的 .csv 文件。

"The Title" | Out-File -FilePath "C:\src\t\sf.csv" -Encoding ascii
(Get-Date).ToString('yyyy-MM-dd') | Out-File -FilePath "C:\src\t\sf.csv" -Encoding ascii -Append
Get-Content -Path 'C:\src\t\csmem.csv' |
    Select-Object -Skip 1 |
    Out-File -FilePath "C:\src\t\sf.csv" -Encoding ascii -Append
于 2019-08-20T20:49:49.063 回答
1

听起来您的起点是一个内存对象数组,要转换为没有标题的 CSV。

要获得没有标题的 CSV 表示,您无需使用- 只需通过管道创建一个中间文件to ,它会生成一个字符串数组,其第一个元素 - 标题行 - 您可以使用.Export-CsvConvertTo-CsvSelect-Object -Skip 1

因此,您的整个文件可以通过一个可扩展的此处字符串写入:

# Format the date string.
$i = 2 # sample value
$dateString = '{0:yyyy-MM-dd}' -f (Get-Date).AddDays($i)

# The input object array
# $objArray = ...

# Use an expandable here-string to write the output file.
@"
Title
$dateString
$($objArray | ConvertTo-Csv | Select-Object -Skip 1 | Out-String)
"@ | Set-Content -NoNewline "c:\users\user123\documents\adh\_$dateString.txt" 

至于你尝试了什么:

尝试使用 [1..-1] 符号将其导入并删除第一行

[1..-1]不会跳过 PowerShell数组的第一个元素,因为1..-1它是扩展为以下索引列表的范围表达式1, 0, -1:也就是说,您要提取3 个元素:第二个 ( 1)、第一个 ( 0) 和最后一个 ( -1)。

还尝试将对象数组写入 TXT,但它仅作为字段出现,而不是像在 CSV 中那样基于选项卡。例子:

这听起来像是您使用 以外的东西将内存中的对象数组发送到文件*.txt这不会给您 CSV 输出;听起来您使用了or ,其中对象的格式与打印到控制台的方式相同,这是一种用于显示的格式,不适合编程处理。Export-Csv>Out-File

get-content ....csv | Select-Object -Skip 1 | Set-Content ....txt

假设输入*.csv文件是用
Export-Csv -NoTypeInformation.

如果您没有使用-NoTypeInformation,请使用-Skip 2,即跳过额外的一行,以便跳过 - 不幸的是 - 默认情况下输出为第一行的类型注释行。Export-Csv

注意: Windows PowerShell中这种违反直觉的默认行为已Export-Csv在PowerShell Core中得到修复。

于 2019-08-21T02:06:22.827 回答
0

在测试环境中复制文件,尝试添加-NoTypeInformation这可能会解决您的问题。

-NoTypeInformation将删除元数据,因此在测试中要小心。

于 2019-08-20T20:41:49.177 回答
0

我能够通过像这样生成测试 CSV 来重现您的问题:

Get-Process | Select ProcessName, ID, SI | Export-CSV C:\temp\test.csv -NoTypeInformation

您偶然发现的是管道的一个有趣方面。我不知道为什么它正在做它正在做的事情的细节,但是你有两种方法可以自动将标题放回 CSV:

  1. 将 -NoClobber 添加到您的 Out-File: Get-Content C:\temp\test.csv | Select -Skip 1 | Out-File -FilePath "C:\temp\new.csv" -NoClobber 这里需要注意的是,它不会让您覆盖使用 Get-Content 打开的文件,因此您必须将其发送到单独的文件
  2. Get-Content C:\temp\test.csv | Select -Skip 1或者,您可以通过将结果存储到变量中,然后将该变量发送到常规的 Out-File 调用来绕过管道。这将使您覆盖文件。
于 2019-08-20T20:49:40.837 回答