private static void ProcessLine( string line, ref FileReadState state, ref List <AlbumPlayed> albums, ref AlbumPlayed currentAlbumPlayed) { if (string.IsNullOrWhiteSpace(line)) { return; } switch (state) { case FileReadState.Reset: ParseLineWhenReset(line, ref state, ref currentAlbumPlayed); break; case FileReadState.OnDate: ParseLineWhenOnDate(line, ref state, ref currentAlbumPlayed); break; case FileReadState.OnLocation: ParseLineWhenOnLocation(line, ref state, ref currentAlbumPlayed); break; case FileReadState.OnArtist: ParseLineWhenOnArtist(line, ref state, ref currentAlbumPlayed, albums); break; } }
private static void ParseLineWhenOnArtist( string line, ref FileReadState state, ref AlbumPlayed currentAlbumPlayed, List <AlbumPlayed> albums) { if (line[0] == '\t' && line[1] == '\t' && line[2] == '\t') { string album = line.TrimEnd(IgnoreChars).TrimStart(IgnoreChars); currentAlbumPlayed.Album = album; albums.Add(currentAlbumPlayed); currentAlbumPlayed = new AlbumPlayed(currentAlbumPlayed); currentAlbumPlayed.Date = currentAlbumPlayed.Date.AddMinutes(1); } else if (line[0] == '\t' && line[1] == '\t') { ParseLineWhenOnLocation(line, ref state, ref currentAlbumPlayed); } else if (line[0] == '\t') { ParseLineWhenOnDate(line, ref state, ref currentAlbumPlayed); } else { ParseLineWhenReset(line, ref state, ref currentAlbumPlayed); } }
public static List <AlbumPlayed> GetAlbumsPlayedFromFile(string filePath) { List <AlbumPlayed> albums = new List <AlbumPlayed>(); // check file exists if (!File.Exists(filePath)) { return(albums); } // default the parsing state data string line; FileReadState parseState = FileReadState.Reset; AlbumPlayed currentAlbumPlayed = new AlbumPlayed(); // Read the file and parse it line by line. StreamReader file = new StreamReader(filePath); while ((line = file.ReadLine()) != null) { ProcessLine(line, ref parseState, ref albums, ref currentAlbumPlayed); } file.Close(); return(albums); }
private static void ParseLineWhenOnDate( string line, ref FileReadState state, ref AlbumPlayed currentAlbumPlayed) { if (line[0] == '\t') { string location = line.TrimEnd(IgnoreChars).TrimStart(IgnoreChars); currentAlbumPlayed.Location = location; state = FileReadState.OnLocation; } }
private static void ParseLineWhenOnLocation( string line, ref FileReadState state, ref AlbumPlayed currentAlbumPlayed) { if (line[0] == '\t' && line[1] == '\t') { string artist = line.TrimEnd(IgnoreChars).TrimStart(IgnoreChars); currentAlbumPlayed.Artist = artist; state = FileReadState.OnArtist; } }
private static void ParseLineWhenReset( string line, ref FileReadState state, ref AlbumPlayed currentAlbumPlayed) { if (char.IsLetterOrDigit(line[0])) { var words = line.Split(' '); if (words.Length >= NumberWordsInDate) { DateTime date = DateTime.Now; if (ParseDateFromString(words, ref date)) { currentAlbumPlayed.Date = date; state = FileReadState.OnDate; } } } }
//------------------------------------------// private bool readFileHeader() { /* * $$HEADERSTART * $$BINARY * $$UNITS/00000000.010000 * $$VERSION/200 * $$LABEL/1,part1 * $$DATE/040513 * $$DIMENSION/00000000.000000,00000000.000000,00000000.000000,00000010.000000,00000012.000000,00000012.980000 * $$LAYERS/000650 * $$HEADEREND */ FileReadState state = FileReadState.none; //- der Header sollte nicht länger als 1000 Byte sein (in der Regel 300 Byte) byte[] buffer = readByte(HEADER_BUFFER_LEN + 5, 0); int bufLen = buffer.Length - 1; for (int i = 0; i < bufLen; i++) { if ((buffer[i] == '/') && (buffer[i + 1] == '/')) //- ein Kommentar beginnt { for (i += 3; i < bufLen; i++) { if ((buffer[i - 1] == '/') && (buffer[i] == '/')) { break; //- Kommentar Ende } } } else if ((buffer[i] == '$') && (buffer[i + 1] == '$')) //- ein Befehl { i += 2; //- 2 bytes ($$) überspringen bool okToken = false; switch (state) { case FileReadState.none: if (compareAndMoveBuffer(buffer, ref i, bufLen, "HEADERSTART")) { state = FileReadState.inhead; okToken = true; } break; case FileReadState.inhead: if (compareAndMoveBuffer(buffer, ref i, bufLen, "BINARY")) { m_FileHead.isBinary = true; okToken = true; } else if (compareAndMoveBuffer(buffer, ref i, bufLen, "ASCII")) { m_FileHead.isBinary = false; okToken = true; break; } else if (compareAndMoveBuffer(buffer, ref i, bufLen, "LAYERS/")) { m_FileHead.layers = readIntAndMove(buffer, ref i, bufLen); okToken = true; } else if (compareAndMoveBuffer(buffer, ref i, bufLen, "UNITS/")) { m_FileHead.unit = (float)readRealAndMove(buffer, ref i, bufLen); okToken = true; } else if (compareAndMoveBuffer(buffer, ref i, bufLen, "VERSION/")) { m_FileHead.version = readIntAndMove(buffer, ref i, bufLen); okToken = true; } else if (compareAndMoveBuffer(buffer, ref i, bufLen, "DIMENSION/")) { m_FileHead.d_x1 = readRealAndMove(buffer, ref i, bufLen); if ((buffer[i] != ',')) { break; } i++; //- trennzeichen dazwischen m_FileHead.d_y1 = readRealAndMove(buffer, ref i, bufLen); if ((buffer[i] != ',')) { break; } i++; //- trennzeichen dazwischen m_FileHead.d_z1 = readRealAndMove(buffer, ref i, bufLen); if ((buffer[i] != ',')) { break; } i++; //- trennzeichen dazwischen m_FileHead.d_x2 = readRealAndMove(buffer, ref i, bufLen); if ((buffer[i] != ',')) { break; } i++; //- trennzeichen dazwischen m_FileHead.d_y2 = readRealAndMove(buffer, ref i, bufLen); if ((buffer[i] != ',')) { break; } i++; //- trennzeichen dazwischen m_FileHead.d_z2 = readRealAndMove(buffer, ref i, bufLen); okToken = true; } else if (compareAndMoveBuffer(buffer, ref i, bufLen, "DATE/")) { m_FileHead.fileDate = readIntAndMove(buffer, ref i, bufLen); okToken = true; } else if (compareAndMoveBuffer(buffer, ref i, bufLen, "LABEL/")) { //- id: Identifier to allow more than one model information in one file. For every id used in the commands start polyline (short/long/ASCII) and start hatches (short/long/ASCII) there shall be one command $$LABEL. Each id causes the building-process to build a different part. readIntAndMove(buffer, ref i, bufLen); //- trennzeichen dazwischen if ((buffer[i] != ',')) { break; } i++; //- text: An ASCII string that gives some comment on the part. readStrAndMove(buffer, ref i, bufLen); okToken = true; } else if (compareAndMoveBuffer(buffer, ref i, bufLen, "ALIGN")) { m_FileHead.align = true; okToken = true; } else if (compareAndMoveBuffer(buffer, ref i, bufLen, "HEADEREND")) { m_FileHead.dataOffset = i; state = FileReadState.afterhead; return(true); } break; } if (!okToken) { m_error.addError("Unknown token in file at pos: " + i); } } else //- unbekannte Zeichenfolge { if ((buffer[i] != ' ') && (buffer[i] != 9) && (buffer[i] != 10) && (buffer[i] != 13)) { m_error.addError("Unknown char in file at pos: " + i); } } } return(false); }