---
alias: user-guide-driver-csv
tags:
- connect iot
description: "This documentation details a CSV file driver for IoT devices, enabling monitoring of comma-separated data files with configurable settings and"
---
# Connect IoT - CSV File Driver
A comma-separated values (CSV) file is a delimited text file that uses a comma to separate values. A CSV file stores tabular data (numbers and text) in plain text. Each line of the file is a data record. Each record consists of one or more fields, separated by commas. The use of the comma as a field separator is the source of the name for this file format.
## Data Types
These are the supported specific data types:
| Name | Description |
| ------- | ---------------- |
| String | String Value |
| Boolean | Boolean Value |
| Integer | Integer value |
| Decimal | Decimal value |
| Object | Structured value |
## Protocol Parameters
The protocol supports the following parameters, used define the communication parameters, as well as the expected behavior of the driver:
| Name | Type | Possible Values | Default Value | Description |
| ---------------------------------- | ------- | -----------------| ------------- | ------------------------------------------------------------ |
| path | String | | "" | Path of the location to monitor for changes on the files. If no value is provided, no watcher is created, so no events will be triggered.|
| fileMask | String | | "**/*.csv" | Glob pattern to use for the watcher to identify the files to handle. Use a tool like to try a valid value to use.|
| hasHeader | Boolean | | True | Do the csv files have header? |
| delimiter | String | | "," | What is the separator of the fields? |
| initialLinesToIgnore | Integer | | 0 | Number of lines to ignore from the beginning of the file |
| commentChar | String | | "" | If set, all text after the character will not be handled |
| numberOfLines | Integer | | 1 | Number of lines of each file to read per round |
| skipEmptyLines | Boolean | | True | Should the parser ignore empty lines? |
| archivePath | String | | "" | Directory planned to use for archiving the files after processing. This value can later be used as a variable in the available operations to execute.|
| watcherType | Enum | Chokidar
NSFW | Chokidar | Type of watcher to use. Depending on the selection, different settings are necessary. Chokidar is the best overall option, but CPU and Memory heavy and slower to start when many files are present. NSFW is better other scenarios. Test both to determine the best option. |
| ignoreInitial | Boolean | | False | Flag to define if, during startup/restart, the files that were created, changed, deleted should be processed or ignored |
| pollingInterval | Integer | | 100 | Interval of file system polling (in milliseconds) |
| alwaysStat | Boolean | | True | Always get additional attributes (size, timestamps, etc) of the file that was identified by the watcher. Will require additional operating system resources.|
| depth | Integer | | 0 | Number of sub directories to watch. The higher the number, more memory/cpu/time will be required for watchers. |
| awaitWriteFinish | Boolean | | True | Trigger watcher events only when the file finishes writing. |
| awaitWriteFinishStabilityThreshold | Integer | | 2000 | Amount of time in milliseconds for a file size to remain constant before emitting its event. |
### Protocol Parameters specific for Chokidar watcherType
Chokidar watcher type has some settings that are only known to it. If using the other type(s), these settings will not have any effect.
| Name | Type | Possible Values | Default Value | Description |
| ---------------------------- | ------- | ----------------------------- | ------------- | ------------------------------------------------------------ |
| watcherMode | Enum | FileSystemEvents
Polling | Polling | To successfully watch files over a network (and in other non-standard situations), it is typically necessary to use Polling, however it could lead to high CPU utilization. FileSystemEvents is the most efficient method for monitoring local files. |
| pollingBinaryInterval | Integer | | 300 | Interval of file system polling for binary files (in milliseconds) |
| awaitWriteFinishPollInterval | Integer | | 100 | File size polling interval |
| atomic | Integer | | 100 | Automatically filters out artifacts that occur within the defined value (in milliseconds) when using editors that use 'atomic writes' instead of writing directly to the source file. If defined to 0, this function is disabled. |
## Extended Parameters
As with other protocol drivers, some extra parameters are necessary to provide more context to the behavior expected.
### Property
| Name | Type | Possible Values | Default Value | Description |
| ------------ | ---- | ------------------------------------------------------------ | ------------- | ------------------------------------------------------------ |
| propertyType | Enum | FileContent
FileName
RelativePath
FullPath
Size
IsFile
IsDirectory
AccessTime
CreationTime
UpdateTime
EndOfFile | FileContent | Provides a meaning of the property, and will receive the value depending of it when specific events occur.
`FileContent` Representation of a field in the file
`FileName` Name of the file being handled
`RelativePath` Relative path of the file being handled
`FullPath` Full path of the file being handled
`Size` Size of the file
`IsFile` Flag indicating if the handle is a file
`IsDirectory` Flag indicating if the handle is a directory
`AccessTime` Date and Time when the file was last accessed
`CreationTime` Date and Time when the file was created
`UpdateTime` Date and Time when the file was last updated
`EndOfFile` Flag indicating the end of file was reached |
| identifierType | Enum | Name
Index
None | Name | Way to identify the field data (defined in the Property Device Id. Only applicable when propertyType is `FileContent`|
### Event
| Name | Type | Possible Values | Default Value | Description |
| ------------ | ---- | ----------------------------------------- | ------------- | ------------------------------------------------------------ |
| EventTrigger | Enum | NewFile
DeletedFile
ChangedFile
NewData | NewData | Indicates the Operating System action that will trigger the event.
`NewFile` When a new file is detected
`DeletedFile` When a file is deleted
`ChangedFile` When a file is changed
`NewData` When the file is created/changed, trigger an event with a number of lines (configurable) |
### Command
| Name | Type | Possible Values | Default Value | Description |
| ----------- | ---- | ------------------------------------------------------------ | ------------- | ------------------------------------------------------------ |
| commandType | Enum | Exists
Copy
Rename
Delete
Move
CreateFile
ReadFile
CreateDirectory
EmptyDirectory
Mount
MoreDataRequest | MoreDataRequest | Indicated the type of command that will be executed.
`Exists` Checks if a file or directory exists
`Copy` Copies a file or entire directory from one location into another
`Rename` Renames a file or directory
`Delete` Deletes a file or directory
`Move` Moves a file or directory
`CreateFile` Create or append data into a file
`ReadFile` Reads the entire content of an existing file
`CreateDirectory` Creates a new directory
`EmptyDirectory` Deletes all files and subdirectories of a directory
`Mount` Mounts a network drive location into a local path
`MoreDataRequest` After Data is processed, request for the next chunk.
`ListFiles` List all files in a directory. |
## Internal Driver Interface
This protocol driver provides a set of interfaces ready to be used to ease the usability within the Controller Workflows. This section is intended to detail them. Although most if not all of these interfaces have specifically designed tasks to use them, the user is free to redefine them in the Driver Definition entity.
### Properties
| Name | PropertyType | Data Type | Description |
| ------------ | -------------- | --------- | ------------------------------------------------------------ |
| FileName | `FileName` | String | Name of the file identified in the watched directory. Will include the extension, but not the directory path. |
| FullPath | `FullPath` | String | File name and the full path where it is located in the local system. |
| FileSize | `Size` | Integer | Size of the file |
| EndOfFile | `EndOfFile` | Boolean | End of file reached |
| ExampleField | `FileContent` | String | Example of a field of the Csv File identified by Header name |
| ExampleField2| `FileContent` | String | DExample of a field of the Csv File identified by index (2nd)|
### Events
| Name | EventTrigger | Properties updated | Description |
| ------------- | ------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| OnNewFile | `NewFile` | `FileName`
`FullPath`
`FileSize`
| When the watcher detects a file that was not previously identified appears, will raise this event.
The timing when it will be triggered may depend on some settings, like `watcherMode`, `awaitWriteFinish`, `awaitWriteFinishStabilityThreshold` and others. |
| OnFileChanged | `ChangedFile` | `FileName`
`FullPath`
`FileSize`
| When the watcher detects a file that was already identified (and triggered the `OnNewFile`event), and it was changed in some way, will raise this event.
The timing when it will be triggered may depend on some settings, like `watcherMode`, `awaitWriteFinish`, `awaitWriteFinishStabilityThreshold` and others. |
| OnFileDeleted | `DeletedFile` | `FileName`
`FullPath`
`FileSize`
| When the watcher detects a file that was previously identified and was now deleted (or moved somewhere), will raise this event. |
| OnDataAvailable | `NewData` | `FullPath`
`ExampleField`
`ExampleField2`
`EndOfFile` | Triggered when data inside the file was read and parsed |
### Commands
All paths of the commands listed in this section can use the following tokens to simplify usability:
| Name | Description | Example |
| ------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| `${Path}` | Replace the token with the `path` setting defined during setup | `${path}\file.csv` becomes `c:\watchedDirectory\file.csv` |
| `${Archive}` | Replace the token with the `archive` setting defined during setup | `${archive}\newFile.csv` becomes `c:\archive\file.csv` |
| Name | CommandType | Parameters / Type / Default Value | Description |
| --------------- | ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| MoreDataRequest | `MoreDataRequest` | `path` / String / "" | After Data is processed, request for the next chunk |
| FileOrDirectoryExists | `Exists` | `path` / String / "" | Checks the `path` location exists |
| CopyFileOrDirectory | `Copy` | `source` / String / ""
`destination` / String / ""
`overwrite` / Boolean / false
`preserveTimestamps` / Boolean / false
`recursive` / Boolean / true
`attempts` / Integer / 1
`sleepBetweenAttempts` / Integer / 1000 | Tries to copy the `source` location (file or directory) into the `destination` location. If it fails, will retry `attempts` times, waiting `sleepBetweenAttempts` milliseconds each time.
If it is a directory and `recursive` is set to true, all subdirectories will also be copied. |
| RenameFileOrDirectory | `Rename` | `source` / String / ""
`destination` / String / ""
`attempts` / Integer / 1
`sleepBetweenAttempts` / Integer / 1000 | Tries to rename the `source` location (file or directory) into the `destination` location. If it fails, will retry `attempts` times, waiting `sleepBetweenAttempts` milliseconds each time.
|
| MoveFileOrDirectory | `Move` | `source` / String / ""
`destination` / String / ""
`overwrite` / Boolean / false
`attempts` / Integer / 1
`sleepBetweenAttempts` / Integer / 1000 | Tries to move the `source` location (file or directory) into the `destination` location. If it fails, will retry `attempts` times, waiting `sleepBetweenAttempts` milliseconds each time.
|
| DeleteFileOrDirectory | `Delete` | `path` / String / "" /
`attempts` / Integer / 1
`sleepBetweenAttempts` / Integer / 1000 | Deleted the `path` location (file or directory). If it fails, will retry `attempts` times, waiting `sleepBetweenAttempts` milliseconds each time. |
| CreateFile | `CreateFile` | `path` / String / ""
`content` / String / ""
`encoding` / String / "utf8"
`mode` / Integer / 0o666
`flag` / String / "w"
`attempts` / Integer / 1
`sleepBetweenAttempts` / Integer / 1000 | Tries to write into a file located in the `path` location. If it fails, will retry `attempts` times, waiting `sleepBetweenAttempts` milliseconds each time.
The `mode` will define the file attributes / permissions using unix format, but in decimal.
The `flag` determines how the file will be accessed (write, rewrite, append, etc). The supported flags are described in |
| ReadFileContent | `ReadFile` | `path` / String / ""
`encoding` / String / "utf8"
`attempts` / Integer / 1
`sleepBetweenAttempts` / Integer / 1000 | Tries to read the contents of the file in the `path` location. If it fails, will retry `attempts` times, waiting `sleepBetweenAttempts` milliseconds each time. |
| CreateDirectory | `CreateDirectory` | `path` / String / ""
`attempts` / Integer / 1
`sleepBetweenAttempts` / Integer / 1000 | Tries to create a new directory in the `path` location. If it fails, will retry `attempts` times, waiting `sleepBetweenAttempts` milliseconds each time. |
| EmptyDirectory | `EmptyDirectory` | `path` / String / ""
`attempts` / Integer / 1
`sleepBetweenAttempts` / Integer / 1000 | Tries to delete all files and subdirectories of `path` location. If it fails, will retry `attempts` times, waiting `sleepBetweenAttempts` milliseconds each time. |
| ListFiles | `ListFiles` | `path` / String / ""
`attempts` / Integer / 1
`sleepBetweenAttempts` / Integer / 1000 | Tries to list all files in the `path` location. If it fails, will retry `attempts` times, waiting `sleepBetweenAttempts` milliseconds each time. |
## Driver Extensions
This protocol driver provides a set of extension that allow the customization to perform actions that are independent of the Driver Definitions associated. This means you can, using customization, get/set node values without needing to describe them.
> This is particularly useful when accessing equipment data that is shared/too complex to access using the regular mechanisms. Also useful when needing to access data whose naming convention may vary from device to device.
### Objects
The objects are structures that are either passed as parameters or returned as result values.
#### RegisterHandler
| Name | Type | Description |
| ---- | ------ | ------------------------------------------------------------ |
| type | String | Id of the event to register a notification. Example: `connect.iot.driver.fileBased.event.ChangedFile_1234567891011`|
#### UnregisterHandler
| Name | Type | Description |
| ---- | ------ | ------------------------------------------------------------ |
| type | String | Id of the event to unregister notifications. Example: `connect.iot.driver.fileBased.event.ChangedFile_1234567891011` |
#### ExecuteCommand
| Name | Type | Description |
| ---------- | ----------- | ------------------------------------------------------------ |
| command | Json object | Includes the command name, device id and parameters types |
| parameters | Json object | Parameter names and values. |
### Methods
#### Register Event Notification
Notifies the protocol driver to raise the occurrences of a specific event when it occurs.
`void connect.iot.driver.fileBased.registerEvent(data: RegisterHandler)`
!!! note
The events will be published to the listeners `connect.iot.driver.fileBased.` appended with the name of the event registered and a random id. Example: `connect.iot.driver.fileBased.event.ChangedFile_1234567891011`
#### Unregister Event Notification
Notifies the protocol driver to stop raising the occurrences of a specific event when they occur.
`void connect.iot.driver.fileBased.unregisterEvent(data: UnregisterHandler)`
#### Example
Notify `connect.iot.driver.fileBased.unregisterEvent`
```json
{
"name": "ChangedFile_1234567891011"
}
```
### Execute Command
Executes a custom command.
`any connect.iot.driver.fileBased.executeCommand(data: ExecuteCommand)`
#### Example
SendRequest `connect.iot.driver.fileBased.executeCommand`
```json
{
"command": {
"name": "FileOrDirectoryExists",
"deviceId": "Exists",
"extendedData": { "commandType": "Exists" },
"parameters": [
{ "name": "path", "dataType": "String", "deviceType": "String" },
],
},
"parameters": {
"path": "c:/temp/file.csv",
}
```