Managing CSV Files in PowerShell with Import


The Best WordPress plugins!

1. WP Reset

2. WP 301 Redirects

3. WP Force SSL

Manually importing a CSV file can be time consuming, but with PowerShell you have the ability to merge and export your data in minutes.

powershell script to parse csv file” is a PowerShell script that can be used in order to manage CSV files. The PowerShell script will allow for the parsing of CSV files and exporting them into other formats.

Managing CSV Files in PowerShell with Import

Administrators may use the PowerShell Export-Csv and PowerShell Import-Csv cmdlets to import CSVs through foreach loop, utilize Export-Csv to append CSVs and export arrays to a CSV file, and much more using the PowerShell Export-Csv and Import-Csv cmdlets.

In this article, you’ll learn about a variety of situations in which PowerShell may be used to handle CSVs, including:

  • Using PowerShell to Read CSV Files
  • Using PowerShell to Save CSV Files
  • Prior to running Export-CSV, format the output.
  • Adding to a CSV file
  • Adding Differences to a File that Already Exists
  • #TYPE String and Export-CSV

If you’re new with CSV files, they’re text files that use a standard structure of physically separating your data in a table with commas. Using the Export-Csv cmdlet and passing one or more objects to it, you may produce a CSV file in PowerShell.

The command below locates the first two processes that are running and sends the objects they create to the Export-Csv cmdlet. The Export-Csv cmdlet then produces a CSV file named processes.csv in your system drive’s root directory (most likely C:).

PS51> Get-Process | Select-Object -First 2 | Export-CSV -Path “$env:SystemDriveprocesses.csv”

Now you may start the procedures. Notepad and csv As headers, you should see “Name,” “SI,” “Handles,” and “VM.” You’ll also see the #TYPE System. Diagnostics. Process, which may or may not make sense right now. Don’t worry, that string will be covered in this post.

Import-Csv allows you to read CSV files.

Do you want more helpful hints like this? Visit my personal PowerShell blog for further information.

There are a few commands in PowerShell that enable you to read text files. Get-Content and Import-Csv are the commands in question. Each of these two cmdlets reads the file in the identical manner. Import-Csv, on the other hand, goes a step farther. Not only does Import-Csv comprehend the underlying structure of a text file, but it also knows the structure of a CSV file.

Import-Csv recognizes the CSV schema because CSV files follow a certain format. This cmdlet not only reads a text file from disk, but it also transforms the CSV file’s rows to PowerShell objects.

Files that aren’t CSV

The data in a CSV is typically comma-separated, although there are situations when data is separated using a different delimiter (not really a CSV at that moment). A tab or a semicolon is occasionally used as a delimiter.

You may use the Delimiter argument if your CSV has a different delimiter. This argument instructs Import-Csv to seek for anything other than commas, which it does by default.

If you have a tab-separated file, for example, you can read it like follows:

PS51> Import-Csv -Path tab-separated-data.csv -Delimiter “`t”

Header is a typical Import-Csv argument. The property names of the objects generated by this cmdlet may be specified using this argument.

The first row of the CSV file is treated as headers by default by the Import-Csv cmdlet. It will then turn these values into row properties (object). However, if your CSV file doesn’t include a header row, you may use the Header argument to create one.

The Header argument stops Import-CSV from utilizing your first row as a header, saving you the time and effort of manually adding headers to the CSV file.

Open notepad and copy/paste the text below to exhibit this behavior. This text will represent a three-row, two-column dataset.

Test.csv is the name of the text file. Don’t forget to enable file type extensions or wrap the file in double quotes to avoid saving it as a.csv.txt file by mistake!

Now, without the Header option, use Import-CSV to read the recently-created CSV file and analyze the results.

PS51> Import-Csv .test.csv a 1 — b 2 c 3

It’s worth noting that the object properties were taken from the first row. You don’t want A and 1 as “labels” for the object attributes. The letters A, B, and C are letters, whereas the numerals 1, 2, and 3 are numbers. You must declare them using the Header parameter, as seen below:

PS51> Import-Csv .test.csv -Header “Letter”, “Number” Letter Number —— —— a 1 b 2 c 3

Using PowerShell to Save CSV Files

You may also go the opposite way if you need to generate or save a CSV file from PowerShell objects. Import-Csv “converts” a CSV file to PowerShell objects, whilst Export-Csv performs the reverse. PowerShell objects are “converted” to a CSV file using this function.

You may see or utilize data in other systems later by saving a CSV file with Export-Csv.

For example, by piping Get-Process to the Export-Csv cmdlet, I may save all running processes on my machine.

PS51> Get-Process | Export-Csv -Path processes.csv

Although the Export-Csv cmdlet is straightforward, there are a few pitfalls to be aware of.

Prior to running Export-CSV, format the output.

As you can see, Export-Csv does a “raw” conversion by itself. It doesn’t add any extra rich-text formatting, colors, or anything like that.

Attempting to make output appear attractive before exporting to a CSV is one of the most prevalent pitfalls. Many users will try to improve the result before exporting it to a CSV file. But, as I’m going to demonstrate, this just makes matters worse.

You may italicize, bold, add colors, and many other things in Microsoft Excel, but if you export the file as a CSV (rather than an Excel workbook), all formatting will be lost. Simply put, a CSV file isn’t “smart” enough.

Remember that CSV files are essentially normal text files with commas separating the information (or sometimes tabs). It is not possible to pipe Import-Csv to a Format-* PowerShell cmdlet.

“Do not format items before submitting them to the Export-CSV cmdlet,” according to the Microsoft instructions. When Export-CSV accepts prepared objects, the format properties are stored in the CSV file rather than the object properties.”

What is the reason behind this?

Create some fake data using a PowerShell window. Let’s look at the Get-Process example from the beginning of this post. Assign the output to a variable this time. Then use the Format-Table cmdlet to pipe those process objects.

PS51> $a = Get-Process PS51> $a | Format-Table

Using the Format-Table commandUsing the Format-Table command

You can see Using the Format-Table command, you now have a clean, tabular output.

Save the output to a different variable now.

PS51> $b = $a | Format-Table

With Get-Member, you can now see the characteristics of both the $a and $b variable values. This cmdlet will explain why these two objects that seem to be similar do not export to a CSV file in the same way:

Object type System.Diagnostics.ProcessObject type System.Diagnostics.Process

Format-Table's many object typesThe several object kinds in Format-Table

TypeName: System.Diagnostics is the output of Get-Process directly. The result from Format-Table, on the other hand, is radically different. It returns a number of distinct types, each with its own set of characteristics.

The output from $a and $b in the console would be identical. The formatting scheme in PowerShell is to blame for this behavior.

What effect does this have on Export-output? Csv’s

PS51> $b | Export-Csv | Format-Table

Each item is read as-is by Export-Csv. You’re modifying the input that Export-CSV gets when you route output to a Format-* cmdlet. This has an impact on the result stored in your new CSV file.

Do not pipe output to any Format-* cmdlet if you’re intending to pipe output to the Export-Csv cmdlet.

Keep in mind that CSVs are all about the data, not the layout.

Adding to a CSV file File

Instead of generating a new file, you could have an existing one that you wish to add to. Export-Csv overwrites any file supplied through the Path option by default.

Use the Add argument to append data to a CSV file.

Assume you have a loop in which you wish to store each item processed as a CSV file. You have a separate object for each iteration that you’d want to store to a CSV file. If you don’t use the Append option, Export-Csv will overrun the CSV file since you’re calling it again. You’ll only receive the last item if you don’t use the Append option, which is usually not what you want.

The following example shows how to locate the first five running processes. It then enters a PowerShell Import-Csv foreach loop, recording the Name and ProductVersion attributes one by one to the test.csv file.

Get-Process | Select-Object -First 5 | Foreach-Object $ | Select-Object Name, ProductVersion | Export-CSV -Path C:test.csv -Append -Append -Append -Append -Append -Append -Append -Append -Append -Append -Append -Append -Append -Append -Append -Append –

Only the fifth process will appear in the CSV file if the Append argument is not used.

Differences are appended to a CSV file.

With Export-Csv, you can only add property differences to an existing CSV file. This indicates that if the columns in a CSV row and the object to record disagree, add them together.

You’ll need to combine the Insert and Force arguments to only append differences to the CSV file. “When the Force and Append arguments are used, objects with mismatched attributes might be written to a CSV file,” according to the Microsoft website. The file is only written with the attributes that match. The attributes that aren’t compatible are discarded.”

Create a single object with two properties: Name and Age, to show.

PS51> $Content = [PSCustomObject]@{Name = “Johnny”; Age = “18”}

Make a new object containing the Name and Zip properties.

PS51> $OtherContent = [PSCustomObject]@{Name = “Joe”; Zip = “02195”}

Each thing has its own set of characteristics.

After that, make a CSV file from the first item and try to attach the second object to it without using the Force argument. You’ll get an error message.

PS51> $Content | Export-CSV -Path .User.csv -NoTypeInformation PS51> $OtherContent | Export-CSV -Path .User.csv -NoTypeInformation -Append

Without Using Force, Export-CsvWithout Using Force, Export-Csv

Export-Csv, on the other hand, will function perfectly if you use the Force option.

PS51> $OtherContent | Export-CSV -Path .User.csv -NoTypeInformation -Append -Force

The Zip column, on the other hand, is missing from the CSV file. Force should be used with caution. It’s possible that it won’t provide the desired result.

PS51> Import-Csv -Path .User.csv Name Age —- — Johnny 18 Joe

#TYPE String and Export-CSV

When you use Export-CSV without any further options, your CSV file will contain a #TYPE string at the top. The kind of object obtained by Export-Csv is then followed by this string.

System.Diagnostics.Process #TYPE

When it comes to consuming output, this string is seldom relevant. This string is only there in case you need to keep track of the object from which the attributes and values originated.

Use the NoTypeInformation argument to delete this string. This argument completely eliminates this string from the CSV.

Note that this is no longer required with PowerShell Core.


The Import-CSV and Export-CSV PowerShell cmdlets make working with CSV files simple. When working with objects and CSV files, these are two helpful cmdlets to have on hand.

My intention is that after reading the descriptions and examples provided here, you will have a clear knowledge of the scenarios in which you may use these cmdlets to your advantage.

Do you want more helpful hints like this? Visit my personal PowerShell blog for further information.

The “powershell import-csv foreach” is a PowerShell command that allows users to manage CSV files. It is best used when importing data from one file into another.

Related Tags

  • powershell script to read csv file and write-output
  • powershell import-csv
  • powershell import-csv to array
  • powershell read csv file line by line
  • powershell import-csv examples

Table of Content