Use this simplest class to write CSV file with out any preparations and types casting declarations.

Find the shortest usage example below.

string Filename = "filename_writer.csv";

  CDKSimplestCSVWriter CSVFile; // Create class object

  // Add first row and set values by column name
  CSVFile.AddRow();
  CSVFile.SetLastRowValue("Time", TimeToString(TimeCurrent(), TIME_DATE|TIME_MINUTES));
  CSVFile.SetLastRowValue("Open", DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_BID), _Digits));
  CSVFile.SetLastRowValue("Close", DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_ASK), _Digits));

  // Add second row using returned row index and SetValue by name
  uint r = CSVFile.AddRow();
  CSVFile.SetValue(r, "Time", TimeToString(TimeCurrent() + 60, TIME_DATE|TIME_MINUTES));
  CSVFile.SetValue(r, "Open", DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_BID), _Digits));
  CSVFile.SetValue(r, "Close", DoubleToString(SymbolInfoDouble(Symbol(), SYMBOL_ASK), _Digits));

  // Demonstrate SetValue by column index (index 0..n-1). Here we set first column of first row to a custom value
  if (CSVFile.RowCount() > 0 && CSVFile.ColumnCount() > 0)
    CSVFile.SetValue(0, 0, "CUSTOM_TIME");

  // Write CSV to file. Pass FILE_ANSI to write ANSI encoded file if desired.
  if (CSVFile.WriteCSV(Filename, true, ";", FILE_ANSI)) {
    PrintFormat("Successfully wrote %d rows with %d columns to: %s", 
                CSVFile.RowCount(), CSVFile.ColumnCount(), Filename);
  } else {
    PrintFormat("Error writing CSV file: %s", Filename);
  }

  // Optional: clear memory
  CSVFile.Clear();