This was a different one, but I enjoy a good Powershell challenge. Based on your data the below would yield the desired results based on your details:
$data = gc -Path "C:\Users\Iris Classon\Documents\data.csv"
$csv = ""
$nl = [Environment]::NewLine
$data | % {
$columns = $_.ToString().Split(',')
For ($i=1; $i -lt $columns.Length; $i++) {
$csv += "{0} {1}{2}" -f $columns[0],$columns[$i],$nl
}
}
Write-Host $csv
Result:
softwarename1 a
softwarename1 b
softwarename1 c
softwarename1 d
softwarename1 e
softwarename1 f
softwarename1 g
softwarename1 h
softwarename1 i
softwarename2 f
softwarename2 e
softwarename2 r
softwarename2 g
softwarename2 u
softwarename2 o
softwarename2 d
softwarename3
softwarename4 x
Here is a function that does the same, but less error prone due to some validation checks.
<#
.SYNOPSIS
Splits CSV in an unusual way..
.DESCRIPTION
.INPUTS
Source file, target file and delimiter
.OUTPUTS
.EXAMPLE
Split-CSV -SourceFile "C:\data.csv" -TargetFile "C:\data3.csv" -Delimiter " "
Split-CSV -SourceFile "C:\data.csv" -TargetFile "C:\data3.csv" -Delimiter ","
#>
function Split-CSV {
[CmdletBinding(SupportsShouldProcess,ConfirmImpact = "high")]
param(
[Parameter(Mandatory = $true,HelpMessage = "`t Please provide path")]
[ValidateNotNullOrEmpty()]
[string]$SourceFile,
[Parameter(Mandatory = $true,HelpMessage = "`t Please provide path")]
[ValidateNotNullOrEmpty()]
[string]$TargetFile,
[Parameter(Mandatory = $true,HelpMessage = "`t Please provide delimiter for new csv")]
[ValidateNotNullOrEmpty()]
[string]$Delimiter
)
$data = gc -Path $SourceFile
$csv = ""
$nl = [Environment]::NewLine
$data | % {
if ($_){
$columns = $_.ToString().Split(',')
if ($columns.Length -gt 1){
For ($i=1; $i -lt $columns.Length; $i++) {
$csv += "{0}{1}{2}{3}" -f $columns[0],$Delimiter,$columns[$i],$nl
}
}
}
}
$csv | Out-File $TargetFile
}
Split-CSV -SourceFile "C:\data.csv" -TargetFile "C:\data3.csv" -Delimiter ","
yields same result as earlier but with comma as a delimiter