Class Csv

All Implemented Interfaces:
AutoCloseable

public class Csv extends ChilkatObject
<section class="csv-summary">

Read, edit, sort, and write CSV or delimiter-separated data in memory.

Chilkat.Csv is a practical in-memory table class for working with CSV and other delimiter-separated text formats. It can load CSV data from files or strings, access cells by row/column index or column name, manage header rows, insert and delete rows or columns, sort records, search for matching rows, and write the result back using configurable delimiters, quoting rules, character encodings, and line endings.

In-memory CSV table

Load CSV data, modify cells, add rows, delete rows or columns, and write the updated table back to a file or string.

Header and named columns

Use a header row to access fields by column name instead of only by numeric column index.

Cell and row operations

Read and update individual cells, insert columns, remove data, find matching rows, and sort the table as needed.

Delimiter control

Work with comma-separated data or other delimiter-separated formats by configuring the delimiter character.

Quoting and output formatting

Control quoted fields, forced quoting, output line endings, explicit character encodings, and UTF-8 BOM emission.

Excel worksheet loading

Load worksheet data from an opened .xlsx ZIP container when CSV-style access to spreadsheet content is needed.

Common pattern: Load CSV data, specify whether the first row is a header, access or modify cells by index or column name, perform any row, column, search, or sort operations, then save the table using the delimiter, charset, quoting, BOM, and line-ending settings required by the target system.

For an extended overview, see Csv Class Overview.

</section>

Instances hold a native Chilkat object: close them with ChilkatObject.close() (try-with-resources) when done; an unclosed instance is freed when it becomes unreachable.

See Also:
Online reference
  • Constructor Details

    • Csv

      public Csv()
      Creates a new Csv object.
  • Method Details

    • getAutoTrim

      public boolean getAutoTrim()
      Controls whether leading and trailing whitespace is removed from values returned by GetCell and GetCellByName.
      • When true, surrounding whitespace such as spaces and tabs is removed from returned cell values.
      • When false, returned cell values are not trimmed. This is the default.

      This property does not modify the cell contents stored in the CSV and does not change the text written by the save methods. It also does not trim the names returned by GetColumnName.

      Returns:
      the value of the AutoTrim property
    • setAutoTrim

      public void setAutoTrim​(boolean value)
      Sets the AutoTrim property; see getAutoTrim().
      Parameters:
      value - the new value
    • getCrlf

      public boolean getCrlf()
      Controls the line endings used by SaveFile, SaveFile2, SaveToString, and SaveToSb.
      • When true, records are terminated with CRLF. This is the default.
      • When false, records are terminated with LF.

      The original line-ending style of loaded data is not preserved. The selected line ending is used for all output records, including the final record.

      Returns:
      the value of the Crlf property
    • setCrlf

      public void setCrlf​(boolean value)
      Sets the Crlf property; see getCrlf().
      Parameters:
      value - the new value
    • getDelimiter

      public String getDelimiter()
      Specifies the single character used to separate fields within each CSV record. The default value is a comma (,).

      Although this property has a string type, only the first character of a non-empty value is used. Assigning an empty string does not clear or reset the current delimiter.

      If the delimiter has not been explicitly set, Chilkat detects it while loading the first CSV data and updates this property with the detected character. The detection may examine more than the first record. Once selected or detected, the delimiter remains in effect for subsequent loads performed by the same object. To load data that uses a different delimiter, explicitly set this property before loading or use a new Csv object.

      A semicolon (;) is commonly used in locales where a comma is used as the decimal separator.

      Creating a new CSV: Set this property before adding rows or columns when a delimiter other than comma is required.

      Vertical-bar delimiter: If this property is explicitly set to |, and EnableQuotes has not been explicitly set, EnableQuotes defaults to false.

      Returns:
      the value of the Delimiter property
    • setDelimiter

      public void setDelimiter​(String value)
      Sets the Delimiter property; see getDelimiter().
      Parameters:
      value - the new value (not null)
    • getEnableQuotes

      public boolean getEnableQuotes()
      Controls whether double quotation marks have their standard CSV meaning when reading and writing data. The default value is true.

      When true, a quoted field is treated as one field even when it contains the delimiter, CR, or LF. A double quotation mark inside a quoted field is represented by two consecutive double quotation marks. Fields created by the application are quoted automatically when required.

      Chilkat retains whether a field loaded from CSV text was quoted, so quotation marks that were not strictly required may remain when the CSV is saved again.

      When false, quotation marks are ordinary characters and do not protect delimiters or line endings. Do not disable quoting when field values can contain the delimiter, quotation marks, CR, or LF, because such values cannot be represented or round-tripped reliably as ordinary delimited text.

      Returns:
      the value of the EnableQuotes property
    • setEnableQuotes

      public void setEnableQuotes​(boolean value)
      Sets the EnableQuotes property; see getEnableQuotes().
      Parameters:
      value - the new value
    • getEscapeBackslash

      public boolean getEscapeBackslash()
      Controls whether a backslash causes the following character to be treated literally while parsing CSV data. The default value is false.

      When true, examples include:

      • \, represents a literal delimiter character.
      • \\ represents one backslash.
      • \" represents a literal double quotation mark.

      This is not C-style escape decoding. For example, \n, \r, and \t produce the literal characters n, r, and t; they do not produce a line feed, carriage return, or tab.

      Normal CSV quoting is still used when output fields contain delimiters or line endings.

      Returns:
      the value of the EscapeBackslash property
    • setEscapeBackslash

      public void setEscapeBackslash​(boolean value)
      Sets the EscapeBackslash property; see getEscapeBackslash().
      Parameters:
      value - the new value
    • getHasColumnNames

      public boolean getHasColumnNames()
      Indicates whether the first record is a column-name row rather than a data row. The default value is false.

      Set this property to true before loading CSV data when the first record contains column names. Chilkat then stores the first record as the column names and excludes it from NumRows and zero-based data-row indexing.

      Changing this property to true after data has already been loaded does not reinterpret the first data row as column names. Calling SetColumnName automatically changes this property to true.

      Methods that address a column by name require this property to be true and require the requested name to exist.

      Returns:
      the value of the HasColumnNames property
    • setHasColumnNames

      public void setHasColumnNames​(boolean value)
      Sets the HasColumnNames property; see getHasColumnNames().
      Parameters:
      value - the new value
    • getNumColumns

      public int getNumColumns()
      The number of columns in the first row of the CSV. When HasColumnNames is true, this is the number of column names in the header row.

      CSV rows may contain different numbers of fields. Therefore, this property is not necessarily the maximum number of columns found in any row. Use GetNumCols to obtain the number of columns in a particular data row.

      Returns:
      the value of the NumColumns property (read-only)
    • getNumRows

      public int getNumRows()
      The number of data rows in the CSV.
      • When HasColumnNames is true, the column-name row is not included.
      • Interior blank rows are included.
      • Empty or whitespace-only rows following the last non-empty row are not included.

      Returns:
      the value of the NumRows property (read-only)
    • getUncommonOptions

      public String getUncommonOptions()
      Provides optional keywords for uncommon CSV-processing requirements. The default value is an empty string, and this property should normally remain empty. To enable more than one option, use a comma-separated list.

      The following keywords are defined:

      • QuotedCells (v9.5.0.96) — Encloses every data cell in double quotation marks when writing the CSV.
      • QuotedColumnNames (v9.5.0.96) — Encloses every column name in double quotation marks when writing the CSV.
      • EMIT_BOM (v9.5.0.93) — Writes a UTF-8 byte order mark when saving a UTF-8 encoded CSV file.

      Returns:
      the value of the UncommonOptions property
    • setUncommonOptions

      public void setUncommonOptions​(String value)
      Sets the UncommonOptions property; see getUncommonOptions().
      Parameters:
      value - the new value (not null)
    • getXlsxDateFormat

      public String getXlsxDateFormat()
      Specifies the date format used when converting Excel date cells from an .xlsx worksheet to CSV text.

      The default value is mm-dd-yy. Other formats include d/m/yyyy, m/d/yyyy, and similar Excel-style date-format patterns.

      Returns:
      the value of the XlsxDateFormat property
    • setXlsxDateFormat

      public void setXlsxDateFormat​(String value)
      Sets the XlsxDateFormat property; see getXlsxDateFormat().
      Parameters:
      value - the new value (not null)
    • deleteColumn

      public void deleteColumn​(int index)
      Deletes the column at zero-based index index. The deletion is applied to the column-name row, when present, and to each data row that contains that column.

      index must not be negative. For predictable deletion, index should be less than NumColumns.

      Parameters:
      index - the index argument
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • deleteColumnByName

      public void deleteColumnByName​(String columnName)
      Deletes the column named by columnName. This method requires HasColumnNames to be true.

      Column-name matching is case-sensitive. Surrounding whitespace in a loaded column name is not part of its lookup name. Column names should be unique to avoid ambiguous lookup and deletion behavior.

      Parameters:
      columnName - the columnName argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • deleteRow

      public void deleteRow​(int index)
      Deletes the data row at zero-based index index. The first data row is at index 0, regardless of whether a column-name row exists.

      index must be between 0 and NumRows - 1.

      Parameters:
      index - the index argument
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • getCell

      public String getCell​(int row, int col)
      Returns the contents of the cell at data row row and column col.

      Row and column indexes are zero-based. The upper-left data cell is at row 0, column 0. When HasColumnNames is true, the header row is not included in the row index.

      • If row is negative or beyond the available data rows, null is returned and LastMethodSuccess is false.
      • If col is negative, null is returned and LastMethodSuccess is false.
      • If row is valid but col is beyond the number of fields in that row, an empty string is returned and LastMethodSuccess is true.

      When AutoTrim is true, surrounding whitespace is removed from the returned value without changing the stored cell content.

      Parameters:
      row - the row argument
      col - the col argument
      Returns:
      the result (never null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • getCellByName

      public String getCellByName​(int rowIndex, String columnName)
      Returns the contents of the cell at data row rowIndex in the column named by columnName. Row indexing begins at 0 and excludes the header row.

      This method requires HasColumnNames to be true. Column-name matching is case-sensitive. Surrounding whitespace is removed from column names for lookup purposes, so columnName should contain the trimmed name. If duplicate lookup names exist, the last matching column is used.

      If the row or column name is invalid, null is returned and LastMethodSuccess is false. When AutoTrim is true, surrounding whitespace is removed from the returned cell value.

      Parameters:
      rowIndex - the rowIndex argument
      columnName - the columnName argument (not null)
      Returns:
      the result, or null if not found (no exception is thrown in that case)
    • getColumnName

      public String getColumnName​(int index)
      Returns the original, untrimmed name of the column at zero-based index index. The first column is at index 0.
      Parameters:
      index - the index argument
      Returns:
      the result (never null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • getIndex

      public int getIndex​(String columnName)
      Returns the zero-based index of the column named by columnName, or -1 if no matching column exists.

      This method requires HasColumnNames to be true. Matching is case-sensitive. Surrounding whitespace is removed from loaded column names for lookup purposes, so columnName should contain the trimmed name. If duplicate lookup names exist, the index of the last matching column is returned.

      Parameters:
      columnName - the columnName argument (not null)
      Returns:
      the result (see ChilkatObject.getLastMethodSuccess() where the description mentions failure)
    • getNumCols

      public int getNumCols​(int row)
      Returns the number of fields in the data row at zero-based index row. This is useful for CSV data containing rows of different lengths.

      Returns 0 if row is negative or beyond the available data rows.

      Parameters:
      row - the row argument
      Returns:
      the result (see ChilkatObject.getLastMethodSuccess() where the description mentions failure)
    • insertColumn

      public void insertColumn​(int index)
      Inserts one empty field into each existing row and, when present, into the column-name row. index is a zero-based insertion position.
      • If index is within a row, the empty field is inserted before that position.
      • If index is at or beyond the end of a row, one empty field is appended to that row.
      • Rows are not padded to a common width, so ragged rows remain ragged.
      • Calling this method on an object with no rows and no column-name row has no effect.

      index must not be negative.

      Parameters:
      index - the index argument
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • loadFile

      public void loadFile​(String path)
      Clears the current contents and loads CSV data from the file specified by path. Set HasColumnNames, Delimiter, EnableQuotes, and other parsing options before calling this method.

      On Windows, the file is decoded using the current Windows ANSI code page. Use LoadFile2 when the character encoding must be specified explicitly.

      The existing CSV contents are cleared before the file is opened. Therefore, a failure such as a missing file does not preserve the previously loaded data.

      Parameters:
      path - the path argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • loadFile2

      public void loadFile2​(String filename, String charset)
      Clears the current contents and loads CSV data from the file specified by filename. charset specifies the character encoding used by the file.

      Set HasColumnNames, Delimiter, EnableQuotes, and other parsing options before calling this method.

      See Supported Charsets for the encoding names recognized by Chilkat.

      Parameters:
      filename - the filename argument (not null)
      charset - the charset argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • loadFromString

      public void loadFromString​(String csvData)
      Clears the current contents and loads the CSV text contained in csvData. Set HasColumnNames, Delimiter, EnableQuotes, and other parsing options before calling this method.

      Passing an empty string successfully clears the CSV. The parser is permissive; for example, an unterminated quoted field extends through the end of csvData rather than necessarily causing the load to fail.

      Parameters:
      csvData - the csvData argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • rowMatches

      public boolean rowMatches​(int rowIndex, String matchPattern, boolean caseSensitive)
      Compares the complete data row at zero-based index rowIndex with the wildcard pattern in matchPattern. The row is compared as one delimited record using the current Delimiter; the pattern may therefore include or span field separators.
      • The asterisk character (*) may appear any number of times and matches zero or more characters.
      • When caseSensitive is true, matching is case-sensitive.
      • When caseSensitive is false, matching is case-insensitive.
      • AutoTrim does not alter the row used for matching.

      Returns true when the row matches matchPattern. Returns false when it does not match or when rowIndex is outside the available data rows.

      Parameters:
      rowIndex - the rowIndex argument
      matchPattern - the matchPattern argument (not null)
      caseSensitive - the caseSensitive argument
      Returns:
      the result; this method never throws ChilkatException
    • saveFile

      public void saveFile​(String path)
      Writes the entire CSV to the file specified by path.

      On Windows, the text is encoded using the current Windows ANSI code page. Use SaveFile2 when the output encoding must be specified explicitly.

      Record endings are controlled by Crlf, and the final record is also followed by the selected line ending.

      Parameters:
      path - the path argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • saveFile2

      public void saveFile2​(String filename, String charset)
      Writes the entire CSV to the file specified by filename. charset specifies the output character encoding, and Chilkat converts the CSV text to that encoding while saving.

      Record endings are controlled by Crlf, and the final record is also followed by the selected line ending.

      See Supported Charsets for the encoding names recognized by Chilkat.

      Parameters:
      filename - the filename argument (not null)
      charset - the charset argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • saveToSb

      public void saveToSb​(StringBuilder sb)
      Clears sb and writes the entire CSV document into it.

      Record endings are controlled by Crlf. sb contains a line ending after the final record.

      Parameters:
      sb - the sb argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • saveToString

      public String saveToString()
      Returns the entire CSV document as a string.

      Record endings are controlled by Crlf. The returned string includes a line ending after the final record. The line-ending style originally loaded into the object is not preserved.

      Returns:
      the result (never null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • setCell

      public void setCell​(int row, int col, String content)
      Sets the cell at zero-based data row row and column col to content.

      The CSV grows as needed. If row is beyond the current last row, intervening rows are created as empty rows. Within the target row, intervening columns are created as empty cells. Other rows are not padded, so the resulting CSV may contain rows with different numbers of fields. Passing NumRows as row appends a new data row.

      content may contain delimiters, quotation marks, CR, and LF when EnableQuotes is true; Chilkat applies the necessary CSV quoting when the data is saved. row and col must not be negative.

      Parameters:
      row - the row argument
      col - the col argument
      content - the content argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • setCellByName

      public void setCellByName​(int rowIndex, String columnName, String contentStr)
      Sets the cell at zero-based data row rowIndex in the column named by columnName to contentStr.

      This method requires HasColumnNames to be true and requires columnName to match an existing column name. Matching is case-sensitive and uses the trimmed lookup form of the stored column name. A missing column is not created.

      The data-row collection grows as needed. contentStr may contain delimiters, quotation marks, CR, and LF when EnableQuotes is true.

      Parameters:
      rowIndex - the rowIndex argument
      columnName - the columnName argument (not null)
      contentStr - the contentStr argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • setColumnName

      public void setColumnName​(int index, String columnName)
      Sets the name of the column at zero-based index index to columnName. The first column is at index 0.

      Calling this method automatically sets HasColumnNames to true. It can therefore be used on an empty object to create the column-name row. index must not be negative.

      For reliable name-based access, use unique column names without surrounding whitespace.

      Parameters:
      index - the index argument
      columnName - the columnName argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • sortByColumn

      public void sortByColumn​(String columnName, boolean ascending, boolean caseSensitive)
      Sorts the data rows using the values in the column named by columnName. The column-name row is not moved.
      • When ascending is true, rows are sorted in ascending order.
      • When ascending is false, rows are sorted in descending order.
      • When caseSensitive is true, comparisons are case-sensitive.
      • When caseSensitive is false, comparisons are case-insensitive.

      Values are compared as strings, not as numbers or dates. For example, ascending order places 10 before 2. Empty or missing sort cells appear first in ascending order and last in descending order. The sort is not stable, so rows having equal sort values may change relative order.

      This method requires HasColumnNames to be true and columnName to name an existing column.

      Parameters:
      columnName - the columnName argument (not null)
      ascending - the ascending argument
      caseSensitive - the caseSensitive argument
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • sortByColumnIndex

      public void sortByColumnIndex​(int index, boolean ascending, boolean caseSensitive)
      Sorts the data rows using the values in the column at zero-based index index. The column-name row, when present, is not moved.
      • When ascending is true, rows are sorted in ascending order.
      • When ascending is false, rows are sorted in descending order.
      • When caseSensitive is true, comparisons are case-sensitive.
      • When caseSensitive is false, comparisons are case-insensitive.

      Values are compared as strings, not as numbers or dates. Empty and missing sort cells are treated as empty strings. They appear first in ascending order and last in descending order. The sort is not stable, so rows having equal sort values may change relative order.

      Parameters:
      index - the index argument
      ascending - the ascending argument
      caseSensitive - the caseSensitive argument
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • xlsxGetSheets

      public void xlsxGetSheets​(Zip xlsx, StringTable sheetNames)
      Gets the worksheet names contained in an Excel .xlsx workbook.
      • xlsx is a Zip object containing the already-opened .xlsx file.
      • sheetNames receives the worksheet names.

      Parameters:
      xlsx - the xlsx argument (not null)
      sheetNames - the sheetNames argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why
    • xlsxLoadSheet

      public void xlsxLoadSheet​(Zip zip, String sheetName)
      Loads a worksheet from an Excel .xlsx workbook into this CSV object.
      • zip is a Zip object containing the already-opened .xlsx file.
      • sheetName is the worksheet name.
      • Pass an empty string in sheetName to load the workbook's default worksheet.

      The XlsxDateFormat property controls the text format used for Excel date cells.

      Parameters:
      zip - the zip argument (not null)
      sheetName - the sheetName argument (not null)
      Throws:
      ChilkatException - if the operation fails; ChilkatException.getLastErrorText() says why