public void OneMutipleLineLineWithDifferentLineSeparators2Test() { var test = "default;value;\"bla\";\"test\r\nsecond\";line\nthird\rfourth"; var result = new CsvLineReader(new StringReader(test), ';', '"').ReadLine(); Assert.Equal("test\r\nsecond", result[3]); }
public void OneSingleLineTest() { var test = "default;value;\"bla\";test\r"; var result = new CsvLineReader(new StringReader(test)).ReadLine(); var expected = "bla"; Assert.Equal(expected, result[2]); }
public void OneMutipleLineLineTest() { var test = "first\r\nsecond"; var reader = new CsvLineReader(new StringReader(test)); reader.ReadLine(); var second = reader.ReadLine(); var expected = "second"; Assert.Equal(expected, second[0]); }
public void OneMutipleLineLineWithDifferentLineSeparatorsTest() { var test = "default;value;\"bla\";test\r\nsecond;line\nthird\rfourth"; var reader = new CsvLineReader(new StringReader(test)); var first = reader.ReadLine(); var second = reader.ReadLine(); var third = reader.ReadLine(); var fourth = reader.ReadLine(); Assert.Equal("third", third[0]); Assert.Equal("fourth", fourth[0]); }
static PhpArray ReadLineCsv(CsvLineReader reader, char delimiter /*=','*/, char enclosure /*='"'*/, char escape_char /*= '\\'*/) { // collect results PhpArray result = new PhpArray(); int i = 0; // index of currently scanned char string line = reader(); // currently scanned string bool eof = false; if (line == null) { result.Add(null); return(result); } for (; ;) { Debug.Assert(i - 1 < line.Length); bool previous_field_delimited = (i == 0 || line[i - 1] == delimiter); // skip initial whitespace: while (i < line.Length && Char.IsWhiteSpace(line[i]) && line[i] != delimiter) { ++i; } if (i >= line.Length) { if (result.Count == 0) { result.Add(null); } else if (previous_field_delimited) { result.Add(string.Empty); } break; } else if (line[i] == delimiter) { if (previous_field_delimited) { result.Add(string.Empty); } ++i; } else if (line[i] == enclosure) { // enclosed string follows: int start = ++i; var field_builder = new StringBuilder(); for (; ;) { // read until enclosure character found: while (i < line.Length && line[i] != enclosure) { if (i + 1 < line.Length && line[i] == escape_char) { ++i; // skip escape char } ++i; // skip following char } // end of line: if (i == line.Length) { // append including eoln: field_builder.Append(line, start, line.Length - start); // field continues on the next line: string nextLine = reader(); if (nextLine == null) { eof = true; break; } line = nextLine; start = i = 0; } else { Debug.Assert(line[i] == enclosure); i++; if (i < line.Length && line[i] == enclosure) { // escaped enclosure; add previous text including enclosure: field_builder.Append(line, start, i - start); start = ++i; } else { // end of enclosure: field_builder.Append(line, start, i - 1 - start); start = i; break; } } } if (!eof)//if (!stream.Eof) { Debug.Assert(start == i && line.Length > 0); int end = GetCsvDisclosedTextEnd(line, delimiter, ref i, escape_char); field_builder.Append(line, start, end - start); } //result.Add(Core.Convert.Quote(field_builder.ToString(), context)); //result.Add(StringUtils.EscapeStringCustom(field_builder.ToString(), charsToEscape, escape)); result.Add(field_builder.ToString()); } else { // disclosed text: int start = i; int end = GetCsvDisclosedTextEnd(line, delimiter, ref i, escape_char); //result.Add( Core.Convert.Quote(line.Substring(start, end - start), context)); //result.Add(StringUtils.EscapeStringCustom(line.Substring(start, end - start), charsToEscape, escape)); result.Add(line.Substring(start, end - start)); } } return(result); }
private static PhpArray ReadLineCsv( CsvLineReader reader, char delimiter/*=','*/, char enclosure/*='"'*/, char escape_char /*= '\\'*/ ) { // collect results PhpArray result = new PhpArray(); int i = 0; // index of currently scanned char string line = reader(); // currently scanned string bool eof = false; if (line == null) { result.Add(null); return result; } for (; ; ) { Debug.Assert(i - 1 < line.Length); bool previous_field_delimited = (i == 0 || line[i - 1] == delimiter); // skip initial whitespace: while (i < line.Length && Char.IsWhiteSpace(line[i]) && line[i] != delimiter) ++i; if (i >= line.Length) { if (result.Count == 0) result.Add(null); else if (previous_field_delimited) result.Add(string.Empty); break; } else if (line[i] == delimiter) { if (previous_field_delimited) result.Add(string.Empty); ++i; } else if (line[i] == enclosure) { // enclosed string follows: int start = ++i; StringBuilder field_builder = new StringBuilder(); for (; ; ) { // read until enclosure character found: while (i < line.Length && line[i] != enclosure) { if (i + 1 < line.Length && line[i] == escape_char) ++i;// skip escape char ++i; // skip following char } // end of line: if (i == line.Length) { // append including eoln: field_builder.Append(line, start, line.Length - start); // field continues on the next line: string nextLine = reader(); if (nextLine == null) { eof = true; break; } line = nextLine; start = i = 0; } else { Debug.Assert(line[i] == enclosure); i++; if (i < line.Length && line[i] == enclosure) { // escaped enclosure; add previous text including enclosure: field_builder.Append(line, start, i - start); start = ++i; } else { // end of enclosure: field_builder.Append(line, start, i - 1 - start); start = i; break; } } } if (!eof)//if (!stream.Eof) { Debug.Assert(start == i && line.Length > 0); int end = GetCsvDisclosedTextEnd(line, delimiter, ref i, escape_char); field_builder.Append(line, start, end - start); } //result.Add(Core.Convert.Quote(field_builder.ToString(), context)); //result.Add(StringUtils.EscapeStringCustom(field_builder.ToString(), charsToEscape, escape)); result.Add(field_builder.ToString()); } else { // disclosed text: int start = i; int end = GetCsvDisclosedTextEnd(line, delimiter, ref i, escape_char); //result.Add( Core.Convert.Quote(line.Substring(start, end - start), context)); //result.Add(StringUtils.EscapeStringCustom(line.Substring(start, end - start), charsToEscape, escape)); result.Add(line.Substring(start, end - start)); } } return result; }
private async Task ProcessCsvFile(SqlConnection conn) { CsvLineReader csv = new CsvLineReader(this._fileReader); for (int i = 1; ; i++) { CsvReadRecordResult result = csv.Read(); if (result.LineResult != CsvReadLineResult.Success) { break; } if (result.Fields.Count == 12) { CreatePaymentResult cpr; Payment payment = null; Exception exception = null; using (SqlTransaction tx = conn.BeginTransaction()) { (cpr, payment, exception) = await this.ProcessPayment(result.Fields, conn, tx); tx.Commit(); } DiagOptions o = DiagOptions.Tech; string message; if (cpr == CreatePaymentResult.Success) { o = DiagOptions.Tech | DiagOptions.Biz; message = "SbReg (" + _sourceFileName + "): Платёж " + payment.Id.ToString() + (payment.Status == Share.PaymentStatus.Approved ? " успешно проведён" : " ожидает подтверждения") + ": " + payment.RawData; } else if (cpr == CreatePaymentResult.Duplicate) { message = "SbReg (" + _sourceFileName + "): Платёж уже обработан: " + payment.RawData; await this._logger.WriteLine(i, "Платёж \"" + result.Fields[3] + "; " + result.Fields[4] + "\" уже создан"); } else { message = "SbReg (" + _sourceFileName + "): Ошибка \"" + exception.Message + "\" при проведении платежа: " + payment.RawData; await this._logger.WriteLine(i, exception.ToString()); } Helper.SaveDiagMessage(_sqlServer, o, message, null); } else if (result.Fields.Count == 6) { try { await this.ProcessTotal(result.Fields); } catch (Exception ex) { await this._logger.Write("Ошибка при обработке итоговой строки: " + ex.ToString(), true); } } else { await this._logger.WriteLine(i, "Строка неопознанного формата"); } } }