To get the correct SAS OLEDB driver or newest SAS OLEDB driver. It is best to do a search e.g. on Google.
NB! You need an account at SAS to be able to download.
And even thou this guide for Installing and configuring an SAS OLEDB-driver for MSSQL is old – it is still very useful.
Be aware, that it is possible to code a program in e.g. .NET that reads a SAS-dataset. It can be done with the SasReader (currently in version 1.0.6).
Below code in C# reads a SAS-dataset and outputs it into a .CSV-file.
Credits to my colleague that figured this out.
using System;
using System.IO;
using SasReader;
using System.Text;
namespace SasToCsvConverter
{
class Program
{
static void Main(string[] args)
{
// Define paths
// string sasFilePath = @"C:\temp\<YOUR SAS-DATASET>.sas7bdat";
// string csvFilePath = @"C:\temp\output.csv";
try
{
// Initialize SAS file reader
using (FileStream sasToParseFileInputStream = File.OpenRead(sasFilePath))
{
SasFileReader sasFileReader = new SasFileReaderImpl(sasToParseFileInputStream);
// Open the CSV file for writing
using (var writer = new StreamWriter(csvFilePath, false, Encoding.UTF8))
{
// Read and write META DATA
var sasMetaColumns = sasFileReader.getColumns();
// Write header
var headerNames = new StringBuilder();
foreach (var column in sasMetaColumns)
{
headerNames.Append(column.getName()).Append(",");
}
// Remove the trailing comma
writer.WriteLine(headerNames.ToString().TrimEnd(','));
// Write DATA
long rowCount = sasFileReader.getSasFileProperties().getRowCount();
for (int i = 0; i < rowCount; i++)
{
var row = sasFileReader.readNext(); // object[]
var rowValues = new StringBuilder();
foreach (var value in row)
{
var stringValue = value?.ToString() ?? string.Empty;
rowValues.Append(EscapeCsvValue(stringValue)).Append(",");
}
// Remove the trailing comma
writer.WriteLine(rowValues.ToString().TrimEnd(','));
// Optional: Log progress
Console.WriteLine($"Processed row {i + 1}/{rowCount}");
}
}
}
Console.WriteLine("Conversion to CSV completed successfully.");
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
private static string EscapeCsvValue(string value)
{
if (value.Contains(",") || value.Contains("\"") || value.Contains("\n"))
{
return $"\"{value.Replace("\"", "\"\"")}\"";
}
return value;
}
}
}