首页 > 解决方案 > Powershell - 将数据字段中有逗号的 2 个 CSV 合并在一起,将其中一个数据逗号解析为分隔符

问题描述

我在$mailboxPathand中找到了 2 个 CSV $mailboxStatisticsPath。我正在使用此代码将两者合并在一起。通过合并我的意思是:

$mailboxPathCSV 有 4 列:ABCD$mailboxStatisticsPathCSV 有 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的列EJohn列。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)"

标签: powershellcsv

解决方案


推荐阅读