Der Webanalyse-Export ist ein CSV-Export aller Seitenaufrufe einer Website.

Es gibt keinen einheitlichen "CSV-Standard"; der Export wird mit dem Paket [`encoding/csv`][csv] erstellt. Einige Hinweise:

- Die erste Zeile ist die Kopfzeile.
- Leerzeilen sind erlaubt; Zeilen können mit `\n` oder `\r\n` enden.
- Felder können optional mit `"` umschlossen werden: `hello,"world"`
- Ein `"` innerhalb eines umschlossenen Feldes wird durch Verdoppelung escaped: `hello,"""world"""`
- Zeilenumbrüche innerhalb umschlossener Felder sind erlaubt.

[csv]: https://pkg.go.dev/encoding/csv#pkg-overview

CSV-Format
----------

Die erste Zeile ist eine Kopfzeile mit den Feldnamen. Die Felder sind in folgender Reihenfolge:

<table>
<tr><th>2,Path</th><td>Pfadname (z.B. <code>/a.html</code>).
    Dient auch als Ereignisname. Diese Kopfzeile ist mit der Version des Exportformats versehen (siehe Versionierung unten).</td></tr>
<tr><th>Title</th><td>Übermittelter Seitentitel.</td></tr>
<tr><th>Event</th><td>Gibt an, ob dies ein Ereignis ist; <code>true</code> oder <code>false</code>.</td></tr>
<tr><th>User-Agent</th><td>Immer leer, da der User-Agent nicht mehr gespeichert wird.</td></tr>
<tr><th>Browser</th><td>Browser-Name und Version.</td></tr>
<tr><th>System</th><td>Betriebssystem-Name und Version.</td></tr>
<tr><th>Session</th><td>Die Session-ID zur Erkennung eindeutiger Besucher.</td>
<tr><th>Bot</th><td>Gibt an, ob es sich um eine Bot-Anfrage handelt; <code>0</code> wenn nicht,
    oder einer der
    <a href="https://pkg.go.dev/zgo.at/isbot?tab=doc#pkg-constants">isbot</a>-Konstanten
    wenn doch.</td></tr>
<tr><th>Referrer</th><td>Referrer-Daten.</td></tr>
<tr><th>Referrer scheme</th><td>
        <code>h</code> – HTTP; eine URL;<br>
        <code>g</code> – Generiert; z.B. verschiedene Hacker-News-Oberflächen fügen keinen Link zur jeweiligen Story hinzu und werden daher nur als "Hacker News" erfasst;<br>
        <code>c</code> – Campaign; Textstring aus einem Campaign-Parameter;<br>
        <code>o</code> – Sonstiges (z.B. Android-Apps).
    </td></tr>
<tr><th>Screen size</th><td>Bildschirmgröße als <code>x,y,scaling</code>.</td></tr>
<tr><th>Location</th><td>ISO-3166-2-Ländercode (entweder "US" oder "US-TX")</td></tr>
<tr><th>FirstVisit</th><td>Erster Aufruf in dieser Session?</td>
<tr><th>Date</th><td>Erstellungsdatum nach RFC 3339/ISO 8601.</td></tr>
</table>

### Versionierung
Das Format der CSV-Datei kann sich in Zukunft ändern; die Version der Exportdatei wird am Anfang der Kopfzeile als Zahl angegeben. Es wird **dringend** empfohlen, diese Zahl zu prüfen, wenn Sie ein Skript zum Importieren oder Synchronisieren von Daten verwenden, und bei einer Änderung einen Fehler auszuwerfen. Künftige Inkompatibilitäten werden hier dokumentiert.

<details>
<summary>Dokumentation Version 1</summary>

<p>Die erste Zeile ist eine Kopfzeile mit den Feldnamen. Die Felder sind in folgender Reihenfolge:</p>
<table>
<tr><th>1,Path</th><td>Pfadname (z.B. <code>/a.html</code>).
    Dient auch als Ereignisname. Diese Kopfzeile ist mit der Version des Exportformats versehen (siehe Versionierung unten).</td></tr>
<tr><th>Title</th><td>Übermittelter Seitentitel.</td></tr>
<tr><th>Event</th><td>Gibt an, ob dies ein Ereignis ist; <code>true</code> oder <code>false</code>.</td></tr>
<tr><th>Bot</th><td>Gibt an, ob es sich um eine Bot-Anfrage handelt; <code>0</code> wenn nicht,
    oder einer der
    <a href="https://pkg.go.dev/zgo.at/isbot?tab=doc#pkg-constants">isbot</a>-Konstanten
    wenn doch.</td></tr>
<tr><th>Session</th><td>Die Session-ID zur Erkennung eindeutiger Besucher.</td>
<tr><th>FirstVisit</th><td>Erster Aufruf in dieser Session?</td>
<tr><th>Referrer</th><td>Referrer-Daten.</td></tr>
<tr><th>Referrer scheme</th><td>
        <code>h</code> – HTTP; eine URL;<br>
        <code>g</code> – Generiert; z.B. verschiedene Hacker-News-Oberflächen fügen keinen Link zur jeweiligen Story hinzu und werden daher nur als "Hacker News" erfasst;<br>
        <code>c</code> – Campaign; Textstring aus einem Campaign-Parameter;<br>
        <code>o</code> – Sonstiges (z.B. Android-Apps).
    </td></tr>
<tr><th>Browser</th><td><code>User-Agent</code>-Header.</td></tr>
<tr><th>Screen size</th><td>Bildschirmgröße als <code>x,y,scaling</code>.</td></tr>
<tr><th>Location</th><td>ISO-3166-1-Ländercode.</td></tr>
<tr><th>Date</th><td>Erstellungsdatum nach RFC 3339/ISO 8601.</td></tr>
</table>
</details>


Import in SQL
-------------

Für eigene Auswertungen können Sie die Daten z.B. in SQLite importieren:

    sqlite> .import --csv gc_export.csv gc_export
    sqlite> select
       ...>   count(*) as count,
       ...>   substr(Location, 0, 3) as location
       ...> from gc_export
       ...> where location != ''
       ...> group by location
       ...> order by count desc
       ...> limit 20;
    ┌────────┬──────────┐
    │ count  │ location │
    ├────────┼──────────┤
    │ 113144 │ US       │
    │ 27092  │ DE       │
    │ 24131  │ GB       │
    │ 13269  │ CA       │
    │ 12977  │ FR       │
    │ 9785   │ NL       │
    │ 8150   │ IN       │
    │ 7487   │ AU       │
    │ 6864   │ PL       │
    │ 6760   │ SE       │
    └────────┴──────────┘

Oder PostgreSQL:

    =# create table gc_export (
        "2Path"             varchar,
        "Title"             varchar,
        "Event"             varchar,
        "UserAgent"         varchar,
        "Browser"           varchar,
        "System"            varchar,
        "Session"           varchar,
        "Bot"               varchar,
        "Referrer"          varchar,
        "Referrer scheme"   varchar,
        "Screen size"       varchar,
        "Location"          varchar,
        "FirstVisit"        varchar,
        "Date"              varchar
    );

    =# \copy gc_export from 'gc_export.csv' with (format csv, header on);
