Inhoud

# Service ScriptForge.TextStream

De service TextStream wordt gebruikt om achtereenvolgens te lezen van en te schrijven naar bestanden die zijn geopend of gemaakt met de service ScriptForge.FileSystem.

De methodes OpenTextFile en CreateTextFile van de service FileSystem retourneren een instantie van de service TextStream.

Lijnscheidingstekens kunnen door de gebruiker worden opgegeven. Bij invoerbewerkingen worden CR, LF of CR+LF ondersteund. Bij uitvoerbewerkingen is het standaardregelscheidingsteken het scheidingsteken dat door het besturingssysteem wordt gebruikt.

Het regelscheidingsteken voor het besturingssysteem waarop de macro wordt uitgevoerd, kan worden geopend met behulp van de eigenschap SF_String.sfNEWLINE.

Alle bewerkingen die nodig zijn om te lezen van of te schrijven naar een bestand (openen, lezen/schrijven en sluiten) worden verondersteld te gebeuren tijdens dezelfde macro-run.

## Service aanroep

Onderstaande voorbeelden in Basic en Python gebruiken de methode OpenTextFile om een instantie van de service TextStream te maken.

##### In BASIC

        GlobalScope.BasicLibraries.LoadLibrary("ScriptForge")
        Dim FSO As Variant
        FSO = CreateScriptService("FileSystem")
        Set myFile = FSO.OpenTextFile("C:\Temp\ThisFile.txt", FSO.ForReading)

Het bestand moet worden gesloten met de methode CloseFile nadat alle lees- of schrijfbewerkingen zijn uitgevoerd:

        myFile.CloseFile()

Optioneel kunnen de bronnen die worden gebruikt door de instantie TextStream worden vrijgegeven met behulp van de methode Dispose:

        Set myFile = myFile.Dispose()

De methodes in de service TextStream zijn meestal gebaseerd op de UNO-interfaces XTextInputStream en XTextOutputStream.

##### In Python

        from scriptforge import CreateScriptService
        fs = CreateScriptService("FileSystem")
        myFile = fs.OpenTextFile(r"C:\Temp\ThisFile.txt", fs.ForReading)
        # ...
        myFile.CloseFile()
        myFile = myFile.Dispose()

## Eigenschappen

Name | AlleenLezen | Type | Beschrijving
--- | --- | --- | ---
AtEndOfStream | Ja | Boolean | Gebruikt in leesmodus. Een waarde True geeft aan dat het einde van het bestand is bereikt. Een test die deze eigenschap gebruikt, moet voorafgaan aan aanroepen van de ReadLine-methode.
Encoding | Ja | String | De tekenset die moet worden gebruikt. De standaardcodering is "UTF-8".
FileName | Ja | String | Retourneert de naam van het huidige bestand in URL-indeling of in de indeling van het eigen besturingssysteem, afhankelijk van de huidige waarde van de eigenschap FileNaming van de service FileSystem.
IOMode | Ja | String | Geeft de invoer-/uitvoermodus aan. Mogelijke waardes zijn "READ", "WRITE" of "APPEND".
Line | Ja | Long | Retourneert het aantal regels dat tot nu toe is gelezen of geschreven.
NewLine | Nee | String | Stelt of retourneert het huidige scheidingsteken dat tussen twee opeenvolgende geschreven regels moet worden ingevoegd. De standaardwaarde is het native lijnscheidingsteken in het huidige besturingssysteem.

Ga voor meer informatie over de namen van karaktersets naar IANA's Character Set-pagina. Houd er rekening mee dat LibreOffice niet alle bestaande tekensets implementeert.

Lijst met methodes in de TextStream-service
CloseFile ReadAll | ReadLine SkipLine | WriteBlankLines WriteLine

## CloseFile

Sluit de huidige invoer- of uitvoerstroom en leegt de uitvoerbuffer indien relevant. Retourneert True als het bestand succesvol is afgesloten.

### Syntaxis:

myFile.CloseFile(): bool

## ReadAll

Retourneert alle resterende regels in de tekststroom als een enkele tekenreeks. Regeleinden worden niet verwijderd.

De resulterende tekenreeks kan in regels worden gesplitst met behulp van de ingebouwde functie Split als het regelscheidingsteken bekend is, of met de methode SF_String.SplitLines.

Voor grote bestanden verspilt het gebruik van de methode ReadAll geheugenbronnen. In dergelijke gevallen wordt aanbevolen om het bestand regel voor regel te lezen met behulp van de methode ReadLine.

### Syntaxis:

myFile.ReadAll(): str

### Voorbeeld:

Beschouw het tekstbestand "Students.txt" met de volgende inhoud (een naam in elke regel):

        Herbie Peggy
        Hardy Jarrett
        Edith Lorelle
        Roderick Rosamund
        Placid Everette

De onderstaande voorbeelden in Basic en Python gebruiken de methodes ReadAll en SplitLines om de inhoud van het bestand in een matrix met tekenreeksen te lezen:

##### In BASIC

        'Laadt de service FileSystem
        Dim FSO : FSO = CreateScriptService("FileSystem")
        'Opent het tekstbestand met de te lezen namen
        Dim inputFile as Object
        Set inputFile = FSO.OpenTextFile("/home/user/Documents/Students.txt")
        'Leest alle inhoud in het invoerbestand als een enkele tekenreeks
        Dim allData as String
        allData = inputFile.ReadAll()
        'Splitst de tekenreeks in een matrix
        Dim arrNames as Variant
        arrNames = SF_String.SplitLines(allData)
        ' (...)
        inputFile.CloseFile()

##### In Python

        fs = CreateScriptService("FileSystem")
        inputFile = fs.OpenTextFile("/home/user/Documents/Students.txt")
        allData = inputFile.ReadAll()
        arrNames = allData.split(inputFile.NewLine)
        # ...
        inputFile.CloseFile()

## ReadLine

Retourneert de volgende regel in de tekststroom als een tekenreeks. Regeleinden worden verwijderd uit de geretourneerde tekenreeks.

De test AtEndOfStream moet voorafgaan aan de methode ReadLine, zoals in het onderstaande voorbeeld.

Er wordt een fout gegenereerd als de AtEndOfStream werd bereikt tijdens de vorige methodeaanroep ReadLine of SkipLine.

### Syntaxis:

myFile.ReadLine(): str

### Voorbeeld:

##### In BASIC

        Dim sLine As String
        Do While Not myFile.AtEndOfStream
            sLine = myFile.ReadLine()
            ' (...)
        Loop

##### In Python

        while not myFile.AtEndOfStream:
            sLine = myFile.ReadLine()
            # ...

## SkipLine

Slaat de volgende regel in de invoerstroom over bij het lezen van een bestand TextStream.

Deze methode kan ertoe leiden dat AtEndOfStream wordt ingesteld op True.

### Syntaxis:

myFile.SkipLine()

## WriteBlankLines

Schrijft een opgegeven aantal lege regels naar de uitvoerstroom.

### Syntaxis:

myFile.WriteBlankLines(lines: int)

### Parameters:

lines: Het aantal lege regels dat naar het bestand moet worden geschreven.

## WriteLine

Schrijft de gegeven tekenreeks naar de uitvoerstroom als een enkele regel.

Het teken dat is gedefinieerd in de eigenschap NewLine wordt gebruikt als regelscheidingsteken.

### Syntaxis:

myFile.WriteLine(line: str)

### Parameters:

line: De te schrijven regel mag leeg zijn.

### Voorbeeld:

De onderstaande voorbeelden in Basic en Python maken een tekstbestand in CSV-indeling, waarin elke regel een waarde en zijn vierkant bevat totdat lastValue is bereikt.

##### In BASIC

        Sub SquaredValuesFile(lastValue as Integer)
            'Maakt de service FileSystem aan'
            Dim FSO as Variant : FSO = CreateScriptService("FileSystem")
            'Maakt een tekstbestand aan
            Dim myFile as Variant : myFile = FSO.CreateTextFile("/home/user/Documents/squares.csv")
            'Schrijft de Waarde en de Waarde in het kwadraat, gescheiden door ";"
            Dim value as Integer
            myFile.WriteLine("Value;Value Squared")
            For value = 1 To lastValue
                myFile.WriteLine(value & ";" & value ^ 2)
            Next value
            'Sluit het bestand en maak bronnen vrij
            myFile.CloseFile()
            Set myFile = myFile.Dispose()
        End Sub

##### In Python

        def squared_values_file(lastValue):
            fs = CreateScriptService("FileSystem")
            myFile = fs.CreateTextFile("/home/user/Documents/squares.csv")
            myFile.WriteLine("Value;Value Squared")
            for value in range(1, lastValue + 1):
                myFile.WriteLine("{};{}".format(value, value ** 2))
            myFile.CloseFile()
            myFile = myFile.Dispose()

Alle ScriptForge Basic-routines of variabelen die beginnen met een underscore "_" zijn voor intern gebruik. Gebruik deze niet in een Basic of Python-macro.

Verwante onderwerpen

ScriptForge.FileSystem-service

Functie Input [VBA]

Instructie Open