Read CSV file with Sequences

This examples shows how a CSV file that is formatted with sequences, can be read using Meta from a Fielded Text Meta File. It uses this example Sequence Meta File.

CSV File:

1,Misty,45
1,Oscar,35
2,Buddy,0.5,35,False
2,Charlie,2,48,True,John,32.0
2,Max,0.5,30,False
3,Bubbles,Orange,Wen
3,Flash,Yellow,Crucian

Console Application

using System;
using Xilytix.FieldedText;

namespace ReadSequence
{
    class Program
    {
        static void Main(string[] args)
        {
            // Name of file containing Meta
            const string MetaFileName = "ExampleSequenceMeta.ftm";
            // Name of file to be read
            const string CsvFileName = "ExampleSequence.csv";

            // Define Field Names
            const string TypeFieldName = "Type";
            const string NameFieldName = "Name";
            const string RunningSpeedFieldName = "RunningSpeed";
            const string WalkDistanceFieldName = "WalkDistance";
            const string TrainingFieldName = "Training";
            const string TrainerFieldName = "Trainer";
            const string SessionCostFieldName = "SessionCost";
            const string ColorFieldName = "Color";
            const string ChineseClassificationFieldName = "ChineseClassification";

            // Define Type values
            const long CatType = 1;
            const long DogType = 2;
            const long GoldFishType = 3;

            const int MaxFieldCount = 7;

            // Create Meta from file
            FtMeta meta = FtMetaSerializer.Deserialize(MetaFileName);

            // Create Reader
            using (FtReader reader = new FtReader(meta, CsvFileName))
            {
                // Normally a reader.Read() will return false when a new table starts
                // in a file.  You would then need to call reader.NextResult() (or
                // reader.NextTable()) to read the record from the next table.
                // When a new table starts, you would need to get new field ordinal
                // values with reader.GetOrdinal() if you are using field ordinals.
                //
                // However this example does not use field ordinal values.  It just
                // uses field names.  Accordingly we want to reader.Read() to return                 // true until no more records.
                //
                // Set AutoNextTable to true for this behaviour.

                reader.AutoNextTable = true;

                // Read each record in text file and write field values to console
                int recNumber = 0;
                while (reader.Read())
                {
                    recNumber++;
                    object[] recObjects = new object[MaxFieldCount];

                    // read Root Sequence Fields
                    recObjects[0] = reader[TypeFieldName];
                    recObjects[1] = reader[NameFieldName];

                    int fieldCount;

                    // Type Field specifies what type of record this is and what
                    // fields there are
                    long type = (long)recObjects[0];
                    switch (type)
                    {
                        case CatType:
                            recObjects[2] = reader[RunningSpeedFieldName];
                            fieldCount = 3;
                            break;

                        case DogType:
                            recObjects[2] = reader[WalkDistanceFieldName];
                            recObjects[3] = reader[RunningSpeedFieldName];
                            recObjects[4] = reader[TrainingFieldName];
                            bool training = (bool)recObjects[4];
                            if (!training)
                                fieldCount = 5;
                            else
                            {
                                recObjects[5] = reader[TrainerFieldName];
                                recObjects[6] = reader[SessionCostFieldName];
                                fieldCount = 7;
                            }
                            break;

                        case GoldFishType:
                            recObjects[2] = reader[ColorFieldName];
                            recObjects[3] = reader[ChineseClassificationFieldName];
                            fieldCount = 4;
                            break;

                        default:
                            fieldCount = 2;
                            break;
                    }

                    Array.Resize<object>(ref recObjects, fieldCount);

                    Console.WriteLine(recNumber.ToString() + ": " +
                                      string.Join(",", recObjects));
                }
            }
        }
    }
}