-
Loading server-accessible data sets via
SQL (or the /execute/sql endpoint call) that
either:
- can be reached by Kinetica via an external data source object
- have been uploaded to Kinetica via SQL or API
- Loading client-side files via ODBC/JDBC
LOAD INTO
Kinetica can load either internal or external data into a table, using aLOAD INTO statement.
- local files uploaded into KiFS
-
a data source configured to allow
access to:
- remote files on Azure, GCS, HDFS, or S3
- remote messages on a Kafka topic
- a remote database queryable via JDBC
LOAD INTO that uses a data source can perform a one-time load upon
creation and optionally subscribe for updates on an interval, depending on the
data source provider:
| Provider | Description | One-Time Load | Subscription |
|---|---|---|---|
| Azure | Microsoft blob storage | Yes | Yes |
| Confluent | Confluent Kafka streaming feed (JSON, GeoJSON, or Avro) | Yes | |
| GCS | Google Cloud Storage | Yes | Yes |
| HDFS | Apache Hadoop Distributed File System | Yes | |
| JDBC | Java DataBase Connectivity; using a user-supplied driver or one of the drivers on the list supported list | Yes | Yes |
| Kafka | Apache Kafka streaming feed (JSON, GeoJSON, or Avro) | Yes | |
| S3 | Amazon S3 Bucket | Yes | Yes |
LOAD INTO with ring resiliency
has additional considerations.
Parameters
DATA
DATA
<schema name>
<schema name>
<table name>
<table name>
FROM REMOTE QUERY
FROM REMOTE QUERY
<source data query> is a SQL query selecting the data
which will be loaded.FROM FILE PATHS clause, and is only
applicable to JDBC data sources.- Any column expression used is given a column alias.
- The first column is not a
WKTor unlimited lengthVARCHARtype. - The columns and expressions queried should match the order, number, & type of the columns in the target table. If the target table doesn’t exist, it will be created using the names and data types of the queried columns in the order in which they appear in the query.
- If
REMOTE_QUERY_NO_SPLITisTRUE, the query will not be distributed. - If a valid
REMOTE_QUERY_PARTITION_COLUMNis specified, the query will be distributed by partitioning on the given column’s values - If a valid
REMOTE_QUERY_ORDER_BYis specified, the query will be distributed by ordering the data accordingly and then partitioning into sequential blocks from the first record - If a non-null numeric/date/time column exists, the query will be distributed by partitioning on the first such column’s values
- The query will be distributed by sorting the data on the first column and then partitioning into sequential blocks from the first record
FROM FILE PATHS
FROM FILE PATHS
<file paths> is a comma-separated list of
single-quoted file paths from which data will be loaded; all files specified are presumed to have
the same format and data types.FROM REMOTE QUERY clause, and is not
applicable to JDBC data sources.-
Data Source: If a data source is specified in the load options, these file paths must resolve
to accessible files at that data source location. A “path prefix” can be specified instead,
which will cause all files whose path begins with the given prefix to be included.
For example, a “path prefix” of
/data/gefor<file paths>would match all of the following:/data/geo.csv/data/geo/flights.csv/data/geo/2021/airline.csv
-
KiFS: The path must resolve to an accessible file path within KiFS.
A “path prefix” can be specified instead, which will cause all files whose path begins with the
given prefix to be included.
For example, a “path prefix” of
kifs://data/gewould match all of the following files under the KiFSdatadirectory:kifs://data/geo.csvkifs://data/geo/flights.csvkifs://data/geo/2021/airline.csv
FORMAT
FORMAT
| Keyword | Description |
|---|---|
[DELIMITED] TEXT | Any text-based, delimited field data file (CSV, PSV, TSV, etc.); a comma-delimited list of options can be given to specify the way in which the data file(s) should be parsed, including the delimiter used, whether headers are present, etc. Records spanning multiple lines are not supported. See Delimited Text Options for the complete list of <delimited text options>. |
AVRO | Apache Avro data file |
JSON | Either a JSON or GeoJSON data file See JSON/GeoJSON Limitations for the supported data types. |
PARQUET | Apache Parquet data file See Parquet Limitations for the supported data types. |
SHAPEFILE | ArcGIS shapefile |
WITH OPTIONS
WITH OPTIONS
<table property clause>
<table property clause>
Delimited Text Options
The following options can be specified when loading data from delimited text files. When reading from multiple files, options specific to the source file will be applied to each file being read.COMMENT = '<string>'
COMMENT = '<string>'
DELIMITER = '<char>'
DELIMITER = '<char>'
char as the source file field delimiter.The default delimiter is a comma, unless a source file has one of these extensions:.psv- will cause|to be the delimiter.tsv- will cause the tab character to be the delimiter
ESCAPE = '<char>'
ESCAPE = '<char>'
char as the source file data escape character. The escape character preceding any
other character, in the source data, will be converted into that other character, except
in the following special cases:| Source Data String | Representation when Loaded into the Database |
|---|---|
<char>a | ASCII bell |
<char>b | ASCII backspace |
<char>f | ASCII form feed |
<char>n | ASCII line feed |
<char>r | ASCII carriage return |
<char>t | ASCII horizontal tab |
<char>v | ASCII vertical tab |
\, a \t encountered in
the data will be converted to a tab character when stored in the database.The escape character can be used to escape the quoting character, and will be treated as
an escape character whether it is within a quoted field value or not.There is no default escape character.HEADER DELIMITER = '<char>'
HEADER DELIMITER = '<char>'
char as the source file header field name/property delimiter, when the source file
header contains both names and properties. This is largely specific to the Kinetica
export to delimited text feature, which will, within each field’s header, contain the
field name and any associated properties, delimited by the pipe | character.An example Kinetica header in a CSV file:| (pipe) character. See
Delimited Text Option Characters for allowed characters.DELIMITER character will still be used to separate
field name/property sets from each other in the header rowINCLUDES HEADER = <TRUE|FALSE>
INCLUDES HEADER = <TRUE|FALSE>
TRUE.NULL = '<string>'
NULL = '<string>'
string as the indicator of a null source field value.The default is \N.QUOTE = '<char>'
QUOTE = '<char>'
char as the source file data quoting character, for enclosing field values.
Usually used to wrap field values that contain embedded delimiter characters, though any
field may be enclosed in quote characters (for clarity, for instance). The quote
character must appear as the first and last character of a field value in order to be
interpreted as quoting the value. Within a quoted value, embedded quote characters may be
escaped by preceding them with another quote character or the escape character specified
by ESCAPE, if given.The default is the " (double-quote) character. See
Delimited Text Option Characters for allowed characters.Delimited Text Option Characters
ForDELIMITER, HEADER DELIMITER, ESCAPE, & QUOTE, any single
character can be used, or any one of the following escaped characters:
| Escaped Char | Corresponding Source File Character |
|---|---|
'' | Single quote |
\a | ASCII bell |
\b | ASCII backspace |
\f | ASCII form feed |
\t | ASCII horizontal tab |
\v | ASCII vertical tab |
'') are specified for a QUOTE
character, the parser will interpret single quotes in the source file as
quoting characters; specifying \t for DELIMITER will cause the parser
to interpret ASCII horizontal tab characters in the source file as delimiter
characters.
Load Options
The following options can be specified to modify the way data is loaded (or not loaded) into the target table.BAD RECORD TABLE
BAD RECORD TABLE
| Column Name | Source Data Format Codes |
|---|---|
line_number | Number of the line in the input file containing the failed record |
char_number | Position of character within a failed record that is assessed as the beginning of the portion of the record that failed to process |
filename | Name of file that contained the failed record |
line_rejected | Text of the record that failed to process |
error_msg | Error message associated with the record processing failure |
ON ERROR mode of ABORT. In that
mode, processing stops at the first error and that error is returned to the user.BATCH SIZE
BATCH SIZE
COLUMN FORMATS
COLUMN FORMATS
- date
- time
- datetime
| Code | Description |
|---|---|
YYYY | 4-digit year |
MM | 2-digit month, where January is 01 |
DD | 2-digit day of the month, where the 1st of each month is 01 |
2010.10.30 into date column d and times of
the 24-hour format 18:36:54.789 into time column t:DATA SOURCE
DATA SOURCE
DEFAULT COLUMN FORMATS
DEFAULT COLUMN FORMATS
COLUMN FORMATS option.For example, to make the default format for loading source data dates like 2010.10.30
and 24-hour times like 18:36:54.789:FIELDS IGNORED BY
FIELDS IGNORED BY
POSITION or NAME. If ignoring by NAME, the
specified names must match the source file field names exactly.-
Identifying by Name:
-
Identifying by Position:
- When ignoring source data file fields, the set of fields that are not ignored must align, in type & number in their order in the source file, with the target table columns into which the data will be loaded.
- Ignoring fields by
POSITIONis only supported for delimited text files.
FIELDS MAPPED BY
FIELDS MAPPED BY
POSITION or NAME. If mapping by NAME, the
specified names must match the source file field names exactly.-
Identifying by Name:
-
Identifying by Position:
- When mapping source data file fields and the target table exists, the set of fields that are identified must align, in type & number in the specified order, with the target table columns into which data will be loaded.
- Mapping fields by
POSITIONis only supported for delimited text files.
FLATTEN_COLUMNS
FLATTEN_COLUMNS
FALSE.| Value | Description |
|---|---|
TRUE | Break up nested columns into multiple columns. |
FALSE | Treat nested columns as JSON columns instead of flattening. |
IGNORE_EXISTING_PK
IGNORE_EXISTING_PK
UPDATE_ON_EXISTING_PK option is used, then this options has no effect.The default is FALSE.| Value | Description |
|---|---|
TRUE | Suppress errors when inserted records and existing records’ PKs match. |
FALSE | Return errors when inserted records and existing records’ PKs match. |
INGESTION MODE
INGESTION MODE
FULL.| Value | Description |
|---|---|
DRY RUN | No data will be inserted, but the file will be read with the applied ON ERROR mode and the number of valid records that would normally be inserted is returned. |
FULL | Data is fully ingested according to the active ON ERROR mode. |
TYPE INFERENCE | Infer the type of the source data and return, without ingesting any data. The inferred type is returned in the response, as the output of a SHOW TABLE command. |
JDBC_FETCH_SIZE
JDBC_FETCH_SIZE
JDBC_SESSION_INIT_STATEMENT
JDBC_SESSION_INIT_STATEMENT
SUBSCRIBE is TRUE.For example, to set the time zone to UTC before running each load, use:KAFKA_CONSUMERS_PER_RANK
KAFKA_CONSUMERS_PER_RANK
1 through 6.The default is 1.KAFKA_GROUP_ID
KAFKA_GROUP_ID
KAFKA_OPTIMISTIC_INGEST
KAFKA_OPTIMISTIC_INGEST
FALSE.KAFKA_OFFSET_RESET_POLICY
KAFKA_OFFSET_RESET_POLICY
earliest.| Value | Description |
|---|---|
earliest | Start streaming from the oldest message in the queue. |
latest | Start streaming from the newest message in the queue. |
KAFKA_SUBSCRIPTION_CANCEL_AFTER
KAFKA_SUBSCRIPTION_CANCEL_AFTER
KAFKA_TYPE_INFERENCE_FETCH_TIMEOUT
KAFKA_TYPE_INFERENCE_FETCH_TIMEOUT
30 seconds.MAX_RECORDS_TO_LOAD
MAX_RECORDS_TO_LOAD
BATCH SIZE, the number of records loaded will be limited to the next whole number of
BATCH SIZE (per working thread).NUM_SPLITS_PER_RANK
NUM_SPLITS_PER_RANK
NUM_TASKS_PER_RANK
NUM_TASKS_PER_RANK
ON ERROR
ON ERROR
ABORT.| Value | Description |
|---|---|
SKIP | If an error is encountered parsing a source record, skip the record. |
ABORT | If an error is encountered parsing a source record, stop the data load process. Primary key collisions are considered abortable errors in this mode. |
POLL_INTERVAL
POLL_INTERVAL
SUBSCRIBE is
TRUE.PRIMARY KEY
PRIMARY KEY
REMOTE_QUERY_INCREASING_COLUMN
REMOTE_QUERY_INCREASING_COLUMN
SUBSCRIBE is TRUE.REMOTE_QUERY_NO_SPLIT
REMOTE_QUERY_NO_SPLIT
FALSE.| Value | Description |
|---|---|
TRUE | Issue the remote data retrieval as a single query. |
FALSE | Distribute and parallelize the remote data retrieval in queries for blocks of data at a time. |
REMOTE_QUERY_ORDER_BY
REMOTE_QUERY_ORDER_BY
REMOTE_QUERY_PARTITION_COLUMN.If REMOTE_QUERY_NO_SPLIT is TRUE, a valid REMOTE_QUERY_PARTITION_COLUMN is specified, or the column given is
invalid, this option is ignored.REMOTE_QUERY_PARTITION_COLUMN
REMOTE_QUERY_PARTITION_COLUMN
REMOTE_QUERY_NO_SPLIT is TRUE or the column given is invalid, this option is ignored.SCHEMA_REGISTRY_SCHEMA_NAME
SCHEMA_REGISTRY_SCHEMA_NAME
SHARD KEY
SHARD KEY
SKIP_LINES
SKIP_LINES
SUBSCRIBE
SUBSCRIBE
DATA SOURCE option.The default is FALSE.| Value | Description |
|---|---|
TRUE | Stream data from the specified data source. |
FALSE | Load all data once from the specified data source. |
TRUNCATE_STRINGS
TRUNCATE_STRINGS
VARCHAR columns that are
not large enough to hold the entire text value.The default is FALSE.| Value | Description |
|---|---|
TRUE | Truncate any inserted string value at the maximum size for its column. |
FALSE | Reject any record with a string value that is too long for its column. |
TRUNCATE_TABLE
TRUNCATE_TABLE
FALSE (don’t truncate the target table).TYPE_INFERENCE_MODE
TYPE_INFERENCE_MODE
SPEED.| Value | Description |
|---|---|
ACCURACY | Scan all available data to arrive at column types that are the narrowest possible that can still hold all the data. |
SPEED | Pick the widest possible column types from the minimum data scanned in order to quickly arrive at column types that should fit all data values. |
UPDATE_ON_EXISTING_PK
UPDATE_ON_EXISTING_PK
FALSE.| Value | Description |
|---|---|
TRUE | Update existing records with records being inserted, when PKs match. |
FALSE | Discard records being inserted when existing records’ PKs match. |
Table Property Clause
A comma-separated list of options for creating the target table, if it doesn’t exist and if the source data file has Kinetica headers, can be specified. Kinetica headers contain column type information, which are used in creating the target table if it doesn’t exist. An example Kinetica header:CHUNK COLUMN MEMORY
CHUNK COLUMN MEMORY
CHUNK MEMORY
CHUNK MEMORY
CHUNK SIZE
CHUNK SIZE
COMPRESSION_CODEC
COMPRESSION_CODEC
TTL
TTL
Examples
File Paths
Single File
To load a CSV file of product data named products.csv in the KiFS directory data, into a table namedproduct:
Multiple Files
When loading files from multiple paths, specify a comma-delimited list of those file paths. To load one file named products.csv and one file named products.kh.csv, both under the KiFS directory data, into a table namedproduct:
File Formats
Single File - No Header
To load a headerless CSV file of product data named products.nh.csv in the KiFS directory data, into a table namedproduct:
Delimited Text Options
To load data from a product data file with the following options:- data file named products.ssv located in the KiFS directory data
- the file has a header
- the field delimiter is a semicolon
- data requiring quotes will have single quotes as the quoting character
- the escape character is the backtick
- the data file represents null values as
<null> - data file comments are on lines starting with
-- - when parse errors are encountered, the record will be skipped
Kinetica Headers
A CSV file with Kinetica headers can be used to specify the column types of the target table when creating it if it doesn’t exist. To load such a file of product data with the following conditions:- data file named products.kh.csv located in the KiFS directory data
- data file contains a Kinetica header
- target table named
product_create_on_load - target table will be created if it doesn’t exist
Parquet File
To load a Parquet file of employee data, employee.parquet, in the KiFS directory data, into a table namedexample.employee_2000:
Kafka
To subscribe to a Kafka data feed with the following conditions:- Kafka remote source is represented by the
kafka_dsdata source - data will be continuously streamed from the Kafka source
- target table named
orders
Table Options
If the target table doesn’t exist, theLOAD INTO command will create it
using the given table options and data type inferencing for the column types.
See Kinetica Headers for an example of loading a
file with Kinetica headers to define the column types of the created table.
Primary/Shard Keys
A CSV file can be used to create a target table with primary & shard keys if it doesn’t exist. To load such a file of employee data with the following conditions:- data file named employee.csv located in the KiFS directory data
- data file does not contain a Kinetica header
- target table named
example.employee - target table will be created if it doesn’t exist
- target table will have a composite primary key on the
id&dept_idcolumns and a shard key onidcolumn, if it is created by this load command
Creation Options
Table creation options can be used to define characteristics of a table when creating it if it doesn’t exist. To load such a file of product data with the following conditions:- data file named products.kh.csv located in the KiFS directory data
- data file does not contain a Kinetica header
- target table named
product_create_options - target table will be created if it doesn’t exist
- target table will have a chunk size of 1,000,000 records, if it is created by this load command
- target table will have a TTL of 5 minutes, and will be dropped if unused for any 5-minute span, if it is created by this load command
Column Options
Column/Field Names
To load specific fields from a product data file, with the following conditions:- data file named products.title-case.csv located in the KiFS directory data
- data file contains a header with fields named
ID,Category,Name,Description, &Stock - target table named
product_name_stock - target columns named
id,name, &stock - only load fields
ID,Name, &Stockinto columnsid,name, &stock - skip records that fail to load successfully
Date/Time Column Types
To apply a specific date format to thehire_date field:
Dry Run
To perform a dry run of a load of a CSV file, products.csv, in the KiFS directory data, into a table namedexample.product:
Data Sources
File-Based
To load a CSV file, products.csv, from the data source example.product_ds, into a table namedexample.product:
Query-Based
To load the results of a remote query of employees in department 2 from the JDBC data source example.jdbc_ds, into a local table namedexample.employee_dept2:
Change Data Capture
File-Based
To load a set of order data in a change data capture scheme with the following conditions:- data pulled through a data source, example.order_ds
- data files contained with an orders directory
- initially, all files in the directory will be loaded; subsequently, only those files that have been updated since the last check will be reloaded
- files will be polled for updates every 5 minutes
- target table named
example.orders - target table will be created if it doesn’t exist
Query-Based
To load the data from a remote query of orders in a change data capture scheme with the following conditions:- data pulled through a data source, example.jdbc_ds
- data contained with an
example.orderstable, where only orders for product with ID 42 will be loaded into the target table - initially, all orders will be loaded; subsequently, only those orders with an
order_idcolumn value higher than the highest one on the previous poll cycle will be loaded - remote table will be polled for updates every 60 seconds
- target table named
example.order_product42 - target table will be created if it doesn’t exist
INSERT INTO … SELECT … FROM FILE
Kinetica can load data from text-based data files that are local to the client into existing tables using a modifiedINSERT INTO ... SELECT statement.
-
If there is a header row, it is either:
-
a simple list of comma-delimited column names:
-
the Kinetica standard format:
-
a simple list of comma-delimited column names:
- The data fields are comma-delimited
-
Strings are optionally enclosed in double-quotes; double-quotes must be
used when the data contains commas; two consecutive double-quotes are used as
an escape code for double-quoted string data containing double-quotes; e.g.:
"This string contains a "" quote mark and a "","" double-quoted comma."This would be loaded into a single string column in Kinetica as:This string contains a " quote mark and a "," double-quoted comma.
Parameters
<schema name>
<schema name>
<table name>
<table name>
<column list>
<column list>
<field list> in number, order, & type.<field list>
<field list>
* to
extract all columns (this wildcard must be used when a source file has no header which
defines field names). This list needs to match all the target table columns (or
those specified in the <column list> option) in number, order, & type.<file name | file name expression>
<file name | file name expression>
*) can be used to specify a group of files<option list>
<option list>
Options
The following options can be specified when loading data from files. When reading from multiple files (using wildcards when specifying the file names), options specific to the source file will be applied to each file being read.BATCH_SIZE=<n>
BATCH_SIZE=<n>
n records.The default batch size is 10,000.COMMENT='<string>'
COMMENT='<string>'
string as comments and skip.The default comment marker is #.DELIMITER='<char>'
DELIMITER='<char>'
char as the source file field delimiter.The default delimiter is ,, unless the source file has one of these extensions:.psv- will cause|to be the delimiter.tsv- will cause the tab character to be the delimiter
ESCAPE='<char>'
ESCAPE='<char>'
char as the source file data escape character. The escape character
preceding any other character, in the source data, will be converted into that
other character, except in the following special cases:| Source Data String | Representation when Loaded into the Database |
|---|---|
<char>a | ASCII bell |
<char>b | ASCII backspace |
<char>f | ASCII form feed |
<char>n | ASCII line feed |
<char>r | ASCII carriage return |
<char>t | ASCII horizontal tab |
<char>v | ASCII vertical tab |
\, a \t encountered in the data
will be converted to a tab character when stored in the database.The escape character can be used to escape the quoting character, and will be
treated as an escape character whether it is within a quoted field value or not.There is no default escape character. See
Option Characters for allowed characters.HEADER=<Y|N>
HEADER=<Y|N>
INITIAL_CLEAR
INITIAL_CLEAR
LIMIT=<n>
LIMIT=<n>
n. If reading from multiple source files, this count is
assessed across all files being read. For example, if n is
15 and the three files being read have 10 records each, all of
the records from the 1st file and the first 5 records from the
2nd file will be loaded. The remaining records in the 2nd
file and all of the records from the 3rd file will be skipped.The default is no limit.NULL='<string>'
NULL='<string>'
string as the indicator of a null source field value.The default is \N.ON_ERROR=<mode>
ON_ERROR=<mode>
<mode>; one of
the following:| Mode | Description |
|---|---|
PERMISSIVE | If an error is encountered parsing a source record, attempt to insert as much of the valid fields from the record as possible. |
SKIP | If an error is encountered parsing a source record, skip the record. |
ABORT | If an error is encountered parsing a source record, stop the data load process. Primary key collisions are considered abortable errors in this mode. |
SKIP.QUOTE='<char>'
QUOTE='<char>'
char as the source file data quoting character, for enclosing field values. Usually
used to wrap field values that contain embedded delimiter characters, though any field may
be enclosed in quote characters (for clarity, for instance). The quote character must
appear as the first and last character of a field value in order to be interpreted as
quoting the value. Within a quoted value, embedded quote characters may be escaped by
preceding them with another quote character or the escape character specified by
ESCAPE, if given.The default is the " (double-quote) character. See
Option Characters for allowed characters.SKIP=<n>
SKIP=<n>
n source file data lines read, not including header and comment lines.
If reading from multiple source files, this count is assessed across all files being read.
For example, if n is 15 and the first two files read have 10 records each, the
first record to be loaded (not skipped) will be the 6th record of the 2nd file.The default is to skip no records.Option Characters
ForDELIMITER, ESCAPE, & QUOTE, any single character can be used, or
any one of the following escaped characters:
| Escaped Char | Corresponding Source File Character |
|---|---|
'' | Single quote |
\\ | Backslash |
\a | ASCII bell |
\b | ASCII backspace |
\f | ASCII form feed |
\t | ASCII horizontal tab |
\v | ASCII vertical tab |
'') are specified for a QUOTE
character, the parser will interpret single quotes in the source file as
quoting characters; specifying \t for DELIMITER will cause the parser
to interpret ASCII horizontal tab characters in the source file as delimiter
characters.
Examples
File Paths
Single File
To load a CSV file of product data located at ../data/products.csv into a table namedproduct:
Multiple Files
To load all files whose names begin withproducts and end in a csv
extension, located under ../data, into a table named product:
Options
Column/Field Names
To load specific fields from a product data file located at ../data/products.csv into specific target table columns:Load Options
To load data from a product data file with the following options:- file located at ../data/products.csv
- only records 4 through 10 will be loaded
- any error will cause the insert to fail
- the target table will be truncated before loading
- records will be inserted into the table in groups of 2
- file located at ../data/products.ssv
- the file has a header
- the field delimiter is a semicolon
- data requiring quotes will have single quotes as the quoting character
- the escape character is the backtick
- the data file represents null values as
<null> - data file comments are on lines starting with
--
Considerations
Multi-Head- If Multi-Head Ingest has been enabled on the database server, file loading through ODBC/JDBC will automatically leverage it, when applicable.
- A blank line in a source data file will be treated as a valid record and will be inserted into the target table as a record with all null fields. If blank lines should not be considered as data, they should be prefixed with the comment marker in order to be skipped by the loading process.
- While GAdmin does not support this command, it does support importing data from client-local files directly.
- While SQL file ingestion is available to ODBC/JDBC clients;
it is not supported within the /execute/sql endpoint,
either as a REST call directly or as an API call (like the Python API’s
execute_sql()function).
stringas comments and skip.The default comment marker is#.