1#include <Processors/Formats/Impl/CSVRowOutputFormat.h>
2#include <Formats/FormatFactory.h>
3
4#include <IO/WriteHelpers.h>
5
6
7namespace DB
8{
9
10
11CSVRowOutputFormat::CSVRowOutputFormat(WriteBuffer & out_, const Block & header_, bool with_names_, FormatFactory::WriteCallback callback, const FormatSettings & format_settings_)
12 : IRowOutputFormat(header_, out_, callback), with_names(with_names_), format_settings(format_settings_)
13{
14 auto & sample = getPort(PortKind::Main).getHeader();
15 size_t columns = sample.columns();
16 data_types.resize(columns);
17 for (size_t i = 0; i < columns; ++i)
18 data_types[i] = sample.safeGetByPosition(i).type;
19}
20
21
22void CSVRowOutputFormat::writePrefix()
23{
24 auto & sample = getPort(PortKind::Main).getHeader();
25 size_t columns = sample.columns();
26
27 if (with_names)
28 {
29 for (size_t i = 0; i < columns; ++i)
30 {
31 writeCSVString(sample.safeGetByPosition(i).name, out);
32
33 char delimiter = format_settings.csv.delimiter;
34 if (i + 1 == columns)
35 delimiter = '\n';
36
37 writeChar(delimiter, out);
38 }
39 }
40}
41
42
43void CSVRowOutputFormat::writeField(const IColumn & column, const IDataType & type, size_t row_num)
44{
45 type.serializeAsTextCSV(column, row_num, out, format_settings);
46}
47
48
49void CSVRowOutputFormat::writeFieldDelimiter()
50{
51 writeChar(format_settings.csv.delimiter, out);
52}
53
54
55void CSVRowOutputFormat::writeRowEndDelimiter()
56{
57 writeChar('\n', out);
58}
59
60void CSVRowOutputFormat::writeBeforeTotals()
61{
62 writeChar('\n', out);
63}
64
65void CSVRowOutputFormat::writeBeforeExtremes()
66{
67 writeChar('\n', out);
68}
69
70
71
72void registerOutputFormatProcessorCSV(FormatFactory & factory)
73{
74 for (bool with_names : {false, true})
75 {
76 factory.registerOutputFormatProcessor(with_names ? "CSVWithNames" : "CSV", [=](
77 WriteBuffer & buf,
78 const Block & sample,
79 FormatFactory::WriteCallback callback,
80 const FormatSettings & format_settings)
81 {
82 return std::make_shared<CSVRowOutputFormat>(buf, sample, with_names, callback, format_settings);
83 });
84 }
85}
86
87}
88