Преобразование accdb в CSV с помощью powershell

#powershell #csv #ms-access

#powershell #csv #ms-access

Вопрос:

Я пытаюсь преобразовать некоторые файлы Excel (.xlsx) и Access (.accdb) в CSV.

Я быстро нашел способ сделать это с помощью Excel, но теперь я не могу найти никакой полезной документации по преобразованию файлов .accdb.

Пока у меня есть:

         $adOpenStatic = 3
        $adLockOptimistic = 3

        $objConnection = New-Object -com "ADODB.Connection"
        $objRecordSet = New-Object -com "ADODB.Recordset"


        $objConnection.Open("Provider = Microsoft.ACE.OLEDB.12.0; Data Source = "   $Filepath)
        $objRecordset.Open("Select * From TableName",$objConnection,$adOpenStatic, $adLockOptimistic)

#Here I need some way to either saveas .csv or loop through
#each row and pass to csv.

        $objRecordSet.Close()
        $objConnection.Close()
  

Есть идеи?

Я был бы готов сделать это с другим языком (VB, Java, PHP), если кто-нибудь знает способ.

Ответ №1:

Если вы используете .Гораздо проще использовать NET, а не COM. Вот некоторый код для обработки файлов Excel XLSX

 #Even /w Excel 2010 installed, needed to install ACE:
#http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16damp;displaylang=en
#Becareful about executing in "right" version x86 vs. x64
#Change these settings as needed
$filepath = 'C:Usersu00Documentsbackupset.xlsx'
#Comment/Uncomment connection string based on version
#Connection String for Excel 2007:
$connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$filepath`";Extended Properties=`"Excel 12.0 Xml;HDR=YES`";"
#Connection String for Excel 2003:
#$connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=`"$filepath`";Extended Properties=`"Excel 8.0;HDR=Yes;IMEX=1`";"
$qry = 'select * from [backupset$]'


$conn = new-object System.Data.OleDb.OleDbConnection($connString)
$conn.open()
$cmd = new-object System.Data.OleDb.OleDbCommand($qry,$conn) 
$da = new-object System.Data.OleDb.OleDbDataAdapter($cmd) 
$dt = new-object System.Data.dataTable 
[void]$da.fill($dt)
$conn.close()
$dt | export-csv ./test.csv -NoTypeInformation
  

Комментарии:

1. У меня уже есть очень простой способ преобразования Excel в CSV с использованием свойства «Excel.saveas» объекта Excel. Может ли это также обрабатывать объекты доступа? (.accdb или .mdb)?

2. Да — просто измените строку подключения и запрос. MS Access также использует поставщика ACE. Смотрите ссылку на формат строки подключения MS Access: connectionstrings.com/access-2007

Ответ №2:

Если вы хотите использовать COM-объект ADODB:

 # loop through all records - do work on each record to convert it to CSV
$objRecordset.Open("Select * FROM Tablename", $objConnection,$adOpenStatic,$adLockOptimistic)

$objRecordset.MoveFirst()

do {
# do your work to get each field and convert this item to CSV
# fields available thru: $objRecordset.Fields['fieldname'].Value
$objRecordset.MoveNext()

} while ($objRecordset.EOF -eq $false)

$objRecordset.Close()