top of page

Split Old fashioned C/AL Object Files

If you are working with older Dynamics NAV versions you need to handle the old fashioned objects by using fob or txt files.


Powershell is very powerful and if you need to split a big txt file full of objects, you can use or powershell script:


We use Measure-Command in our script to see how long it takes to split about 6.000 object:

TotalSeconds      : 57,6412381

This script is using streamwriter and stringbuilder which makes it very fast:

$sourcepath = "D:\Source\"
$targetpath = "D:\Target\"
Remove-Item $targetpath*.txt -Recurse -Force
Measure-Command -Expression {
    Get-ChildItem $sourcepath  -Filter *.txt | Foreach-Object {
        $filepath = $_.FullName
        $lines = [IO.File]::OpenText($filepath)
        while ( -not $lines.EndOfStream) {
            $line = $lines.ReadLine()
            if ($line -match "OBJECT (Table|Report|Codeunit|Page|Query|XMLport|Form|Dataport|MenuSuite) (\d+) (.*)") {
                if ($newfilepath) {
                    $Textstream = [System.IO.StreamWriter]::new($newfilepath, $true)
                    $Textstream.Write($arr.ToString())
                    $Textstream.close()
                    $arr.Clear();
                    $arr = [System.Text.StringBuilder]::new()
                }
                $newfilepath = (Join-Path -Path $targetpath -ChildPath ($Matches[1].ToLower() + '_' + ('{0:d10}' -f [int]$Matches[2]) + $_.Extension));
            }
            if ($line) {
                [void]$arr.Append($line + "`r`n") 
            }
        }
        $lines.close()
    }
}

You are going to see two more solutions in our repo by using commands like Out-File or Add-Content.


If you compare all three methods by splitting 25 Objects you will discover how fast streamwriter and streambuilder is:


TotalSeconds      : 36,6870116

Out-File takes:

TotalSeconds      : 8,2034

TotalSeconds      : 0,3723087

Get the code here:


Have fun!

206 Ansichten2 Kommentare

Aktuelle Beiträge

Alle ansehen

2 Comments


@Nitin Verma Could you please send me your script to daniel.gorski@beyondit.gmbh?

Like

Nitin Verma
Nitin Verma
Feb 06, 2023

Hello,

I tried to use this script to split text files in NAV. However, when I run the script in powershell I am seeing the following error. However, when the script finishes executing, all the objects are in individual files.


You cannot call a method on a null-valued expression.

At \\cd-fs01\UserFiles\GIT\Split-Objects.ps1:23 char:17

+ [void]$arr.Append($line + "`r`n")

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (:) [], RuntimeException

+ FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.

At \\cd-fs01\UserFiles\GIT\Split-Objects.ps1:14 char:21

+ $Textstream.Write($arr.ToString())

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (:) [], RuntimeException

+ FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.

At \\cd-fs01\UserFiles\GIT\Split-Objects.ps1:16 char:21

+ $arr.Clear();

+ ~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (:) [], RuntimeException

Like
bottom of page