powershell - Powershell - 将数据字段中有逗号的 2 个 CSV 合并在一起,将其中一个数据逗号解析为分隔符
问题描述
我在$mailboxPath
and中找到了 2 个 CSV $mailboxStatisticsPath
。我正在使用此代码将两者合并在一起。通过合并我的意思是:
$mailboxPath
CSV 有 4 列:A
、B
、C
、D
。$mailboxStatisticsPath
CSV 有 2 列:E
, F
.
合并后的 CSV 将包含以下列:A
, B
, C
, D
, E
,F
我使用此代码这样做:
$csv1 = @(gc $mailboxPath)
$csv2 = @(gc $mailboxStatisticsPath)
$combinedMailbox = @()
for ($i=0; $i -lt $csv1.Count; $i++) {
$combinedMailbox += $csv1[$i] + ', ' + $csv2[$i]
}
# Output to file
$combinedMailbox | Out-File "$dirname\CombinedMailbox.csv" -encoding default
在$mailboxStatisticsPath
文件中,第一列包含带有逗号的数据,例如:Smith, John
. 第二列还包含包含逗号的数据,例如:513.4 KB (525,772 bytes)
.
当上面的代码运行时,它取第一列并将逗号作为分隔符,将行Smith, John
分成不正确Smith
的列E
和John
列。F
为什么它会将Smith, John
逗号计为分隔符,而将文件大小值中的逗号计为数据的一部分而不将其作为分隔符处理?是不是因为第一个单元格中的逗号后面有一个空格,而第二个单元格中没有?
如果是这种情况,如何以我上面定义的方式正确合并两个 CSV,而不根据是否有带空格的逗号将数据拆分为多个不同的单元格?
编辑: 这是完整的 powershell 脚本:
Set-ExecutionPolicy RemoteSigned
# Connect to exchange online
Connect-ExchangeOnline -Credential $UserCredential -ShowProgress $true
# Read the client name
$clientName = Read-Host 'Client name?'
$dirname = "sample_path\$clientName"
# Create folder
New-Item -ItemType Directory -Force -Path $dirname
# Setup mailbox and mailbox statistics CSV paths. If they exist, remove them first.
$mailboxPath = "$dirname\Mailbox.csv"
$mailboxStatisticsPath = "$dirname\MailboxStatistics.csv"
rm $mailboxPath -ea ig
rm $mailboxStatisticsPath -ea ig
# Get the user mailbox data
$mailbox = Get-Mailbox
# Add client name as a property to the mailbox object
$mailbox | Add-Member -NotePropertyName ClientName -NotePropertyValue $clientName -Force
$mailbox | Select-Object Name, ArchiveStatus, ArchiveWarningQuota, ClientName, ProhibitSendQuota, ProhibitSendReceiveQuota | Export-Csv $mailboxPath -notypeinformation
# Get the user mailbox statistics data
$mailbox | select -expand userprincipalname | Get-MailboxStatistics | Select-Object DisplayName, TotalItemSize | Export-Csv $mailboxStatisticsPath -notypeinformation
#Import the CSVs
# Create an Empty Array
$csv1 = @(gc $mailboxPath)
$csv2 = @(gc $mailboxStatisticsPath)
$combinedMailbox = @()
for ($i=0; $i -lt $csv1.Count; $i++) {
$combinedMailbox += $csv1[$i] + ', ' + $csv2[$i]
}
# Output to file
$combinedMailbox | Out-File "$dirname\CombinedMailbox.csv" -encoding default
# Delete the originals
# Remove-Item $mailboxPath
# Remove-Item $mailboxStatisticsPath
Disconnect-ExchangeOnline
样本数据来自$mailboxStatisticsPath
:
"DisplayName","TotalItemSize"
"Smith, John","513.4 KB (525,772 bytes)"
解决方案
推荐阅读
- python - Extracting statistics/information from images
- c# - C# MVC:操作可能会破坏运行时的稳定性
- python - 计划任务执行中的芹菜错误
- sockets - ICMP RAW Socket 接收不完整
- automation - 编码的 ui 对象存储库
- mysql - 表被锁定在 MySQL 数据库中
- mongodb - Mongodb 3.4.7 分组后一个字段的聚合不同计数
- c# - C# 检查 PropertyInfo 的类型是否是原始的
- android - ExoPlayer ConcatenatingMediaSource ArrayIndexOutOfBoundsException
- matlab - 如何在matlab中对结构数组求和?