public clsKartotek(string pCsvString) { m_CsvString = pCsvString; m_Csv = new clsCsv(); m_Csv.ln = CsvString; m_Csv.todo = CsvToDoType.fdUpdateClsKartotek; clsCsv.KartotekFieldUpdate += new nsPuls3060v2.clsCsv.KartotekFieldUpdateHandler(On_KartotekFieldUpdate); ParseCsvString(ref m_Csv); clsCsv.KartotekFieldUpdate -= new nsPuls3060v2.clsCsv.KartotekFieldUpdateHandler(On_KartotekFieldUpdate); }
public void Push() { object objcopy = this.MemberwiseClone(); clsCsv cp = (clsCsv)objcopy; m_ln = m_value; m_lnLen = m_ln.Length; m_value = ""; m_stack[m_niveau] = cp; m_niveau = m_niveau + 1; }
private void ParseCsvString(ref clsCsv Csv) { ParseStatus stat; FoundChars found = FoundChars.fdNoneFound; Csv.nr = 0; Csv.comma_end = -1; stat = ParseStatus.fdParserOutsideField; for (Csv.n = 0; Csv.n < Csv.lnLen; Csv.n++) { switch (stat) { case ParseStatus.fdParserInField: switch (Csv.ln.Substring(Csv.n, 1)) { case ",": Csv.comma_end = Csv.n; Csv.fld_end = Csv.n - 1; Csv.nr++; Csv.value = Csv.ln.Substring(Csv.fld_start, Csv.fld_end - Csv.fld_start + 1); if (Csv.multifld == true) { Csv.Push(); ParseCsvString(ref Csv); Csv.Pop(); } Csv.todoAction(); stat = ParseStatus.fdParserOutsideField; break; default: if (Csv.n == Csv.lnLen - 1) // End of line condition { Csv.comma_end = Csv.n + 1; Csv.fld_end = Csv.n; Csv.nr++; Csv.value = Csv.ln.Substring(Csv.fld_start, Csv.fld_end - Csv.fld_start + 1); if (Csv.multifld == true) { Csv.Push(); ParseCsvString(ref Csv); Csv.Pop(); } Csv.todoAction(); stat = ParseStatus.fdParserOutsideField; } break; } break; case ParseStatus.fdParserInFieldQuoted: switch (Csv.ln.Substring(Csv.n, 2)) { case "\"\"": //Double quote if ((found & FoundChars.fdDoubleQuoteFound) != FoundChars.fdDoubleQuoteFound) { found = found | FoundChars.fdDoubleQuoteFound; } Csv.n++; break; case "\",": //Quote + comma Csv.comma_end = Csv.n + 1; Csv.fld_end = Csv.n - 1; Csv.nr++; Csv.value = Csv.ln.Substring(Csv.fld_start, Csv.fld_end - Csv.fld_start + 1); if (Csv.multifld) { Csv.Push(); ParseCsvString(ref Csv); Csv.Pop(); } Csv.todoAction(); Csv.n++; stat = ParseStatus.fdParserOutsideField; break; #region Found chars default: switch (Csv.ln.Substring(Csv.n, 1)) { case " ": if ((found & FoundChars.fdBlankFound) == FoundChars.fdBlankFound) { found = found | FoundChars.fdBlankFound; } break; case ",": if ((found & FoundChars.fdCommaFound) == FoundChars.fdCommaFound) { if ((found & FoundChars.fdMoreCommasFound) != FoundChars.fdMoreCommasFound) { found = found | FoundChars.fdMoreCommasFound; } } else { found = found | FoundChars.fdCommaFound; } break; case "\"": if ((found & FoundChars.fdQuoteFound) != FoundChars.fdQuoteFound) { found = found | FoundChars.fdQuoteFound; } break; case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": if ((found & FoundChars.fdNumberFound) != FoundChars.fdNumberFound) { found = found | FoundChars.fdNumberFound; } break; case "+": case "-": if ((found & FoundChars.fdSignFound) != FoundChars.fdSignFound) { found = found | FoundChars.fdSignFound; } break; case ".": if ((found & FoundChars.fdDotFound) != FoundChars.fdDotFound) { found = found | FoundChars.fdDotFound; } break; default: if ((found & FoundChars.fdAlfaFound) != FoundChars.fdAlfaFound) { found = found | FoundChars.fdAlfaFound; } break; } break; #endregion } break; case ParseStatus.fdParserInFieldDoubleQuoted: switch (Csv.ln.Substring(Csv.n, 3)) { case "\"\",": //Double Quote + comma Csv.comma_end = Csv.n + 2; Csv.fld_end = Csv.n - 1; Csv.nr++; Csv.value = Csv.ln.Substring(Csv.fld_start, Csv.fld_end - Csv.fld_start + 1); Csv.todoAction(); Csv.n += 2; stat = ParseStatus.fdParserOutsideField; break; #region Found chars default: switch (Csv.ln.Substring(Csv.n, 1)) { case " ": if ((found & FoundChars.fdBlankFound) == FoundChars.fdBlankFound) { found = found | FoundChars.fdBlankFound; } break; case ",": if ((found & FoundChars.fdCommaFound) == FoundChars.fdCommaFound) { if ((found & FoundChars.fdMoreCommasFound) != FoundChars.fdMoreCommasFound) { found = found | FoundChars.fdMoreCommasFound; } } else { found = found | FoundChars.fdCommaFound; } break; case "\"": if ((found & FoundChars.fdQuoteFound) != FoundChars.fdQuoteFound) { found = found | FoundChars.fdQuoteFound; } break; case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": if ((found & FoundChars.fdNumberFound) != FoundChars.fdNumberFound) { found = found | FoundChars.fdNumberFound; } break; case "+": case "-": if ((found & FoundChars.fdSignFound) != FoundChars.fdSignFound) { found = found | FoundChars.fdSignFound; } break; case ".": if ((found & FoundChars.fdDotFound) != FoundChars.fdDotFound) { found = found | FoundChars.fdDotFound; } break; default: if ((found & FoundChars.fdAlfaFound) != FoundChars.fdAlfaFound) { found = found | FoundChars.fdAlfaFound; } break; } break; #endregion } break; case ParseStatus.fdParserOutsideField: switch (Csv.ln.Substring(Csv.n, 1)) { case ",": stat = ParseStatus.fdParserOutsideField; Csv.nr++; Csv.comma_start = Csv.comma_end; Csv.comma_end = Csv.n; Csv.fld_start = Csv.n; Csv.fld_end = Csv.n - 1; Csv.value = Csv.ln.Substring(Csv.fld_start, Csv.fld_end - Csv.fld_start + 1); if (Csv.multifld) { Csv.Push(); ParseCsvString(ref Csv); Csv.Pop(); } Csv.todoAction(); break; case "\"": if (Csv.ln.Substring(Csv.n, 3) == "\"\"\"") //Trible quote { stat = ParseStatus.fdParserInFieldQuoted; found = FoundChars.fdNoneFound; Csv.comma_start = Csv.comma_end; Csv.fld_start = Csv.n + 1; } else if (Csv.ln.Substring(Csv.n, 2) == "\"\"") //Double quote { stat = ParseStatus.fdParserInFieldDoubleQuoted; Csv.comma_start = Csv.comma_end; found = FoundChars.fdNoneFound; Csv.fld_start = Csv.n + 2; Csv.n++; } else //Single quote { stat = ParseStatus.fdParserInFieldQuoted; found = FoundChars.fdNoneFound; Csv.comma_start = Csv.comma_end; Csv.fld_start = Csv.n + 1; } break; default: stat = ParseStatus.fdParserInField; Csv.comma_start = Csv.comma_end; Csv.fld_start = Csv.n; break; } break; } } }