Exemplo n.º 1
0
            public void writerow(CodeContext /*!*/ context, object sequence)
            {
                IEnumerator e = null;

                if (!PythonOps.TryGetEnumerator(context, sequence, out e))
                {
                    throw MakeError("sequence expected");
                }

                int rowlen = PythonOps.Length(sequence);

                // join all fields in internal buffer
                JoinReset();
                while (e.MoveNext())
                {
                    object field  = e.Current;
                    bool   quoted = false;

                    switch (_dialect.quoting)
                    {
                    case QUOTE_NONNUMERIC:
                        quoted = !(PythonOps.CheckingConvertToFloat(field) ||
                                   PythonOps.CheckingConvertToInt(field) ||
                                   PythonOps.CheckingConvertToLong(field));
                        break;

                    case QUOTE_ALL:
                        quoted = true;
                        break;
                    }

                    if (field is string)
                    {
                        JoinAppend((string)field, quoted, rowlen == 1);
                    }
                    else if (field is double)
                    {
                        JoinAppend(DoubleOps.__str__(context, (double)field),
                                   quoted, rowlen == 1);
                    }
                    else if (field is float)
                    {
                        JoinAppend(SingleOps.__str__(context, (float)field),
                                   quoted, rowlen == 1);
                    }
                    else if (field == null)
                    {
                        JoinAppend(string.Empty, quoted, rowlen == 1);
                    }
                    else
                    {
                        JoinAppend(field.ToString(), quoted, rowlen == 1);
                    }
                }

                _rec.Add(_dialect.lineterminator);

                PythonOps.CallWithContext(
                    context, _writeline, string.Join("", _rec.ToArray()));
            }
Exemplo n.º 2
0
            public void writerow(CodeContext /*!*/ context, object sequence)
            {
                IEnumerator e;

                if (!PythonOps.TryGetEnumerator(context, sequence, out e))
                {
                    throw MakeError($"iterable expected, not {PythonTypeOps.GetName(sequence)}");
                }

                // join all fields in internal buffer
                JoinReset();
                while (e.MoveNext())
                {
                    object field  = e.Current;
                    var    quoted = _dialect.quoting switch {
                        QUOTE_NONNUMERIC => !(PythonOps.CheckingConvertToFloat(field) ||
                                              PythonOps.CheckingConvertToInt(field) ||
                                              PythonOps.CheckingConvertToLong(field)),
                        QUOTE_ALL => true,
                        _ => false,
                    };

                    if (field is string)
                    {
                        JoinAppend((string)field, quoted);
                    }
                    else if (field is double)
                    {
                        JoinAppend(DoubleOps.__repr__(context, (double)field), quoted);
                    }
                    else if (field is float)
                    {
                        JoinAppend(SingleOps.__repr__(context, (float)field), quoted);
                    }
                    else if (field is null)
                    {
                        JoinAppend(string.Empty, quoted);
                    }
                    else
                    {
                        JoinAppend(PythonOps.ToString(context, field), quoted);
                    }
                }

                if (_num_fields > 0 && _rec.Length == 0)
                {
                    if (_dialect.quoting == QUOTE_NONE)
                    {
                        throw MakeError("single empty field record must be quoted");
                    }
                    _num_fields--;
                    JoinAppend(string.Empty, quoted: true);
                }

                _rec.Append(_dialect.lineterminator);

                PythonOps.CallWithContext(context, _writeline, _rec.ToString());
            }