75062dbf5e
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
from flask import Blueprint, request, jsonify
|
|
import csv
|
|
import io
|
|
from util.logger import logger
|
|
from auth.token import verify_token
|
|
|
|
csv_blueprint = Blueprint('csv_tool', __name__)
|
|
|
|
MAX_ROWS = 500
|
|
|
|
|
|
@csv_blueprint.route('/api/csv/parse', methods=['POST'])
|
|
def parse_csv():
|
|
user = verify_token()
|
|
if not user:
|
|
return jsonify({"message": "Nicht autorisiert"}), 401
|
|
try:
|
|
data = request.get_json() or {}
|
|
text = data.get("text", "")
|
|
delimiter = data.get("delimiter", ",")
|
|
|
|
# Handle escaped tab
|
|
if delimiter == "\\t" or delimiter == "\t":
|
|
delimiter = "\t"
|
|
if not delimiter:
|
|
delimiter = ","
|
|
|
|
reader = csv.reader(io.StringIO(text), delimiter=delimiter)
|
|
all_rows = list(reader)
|
|
|
|
if not all_rows:
|
|
return jsonify({"headers": [], "rows": [], "total_rows": 0, "truncated": False})
|
|
|
|
headers = all_rows[0]
|
|
data_rows = all_rows[1:]
|
|
total_rows = len(data_rows)
|
|
truncated = total_rows > MAX_ROWS
|
|
|
|
return jsonify({
|
|
"headers": headers,
|
|
"rows": data_rows[:MAX_ROWS],
|
|
"total_rows": total_rows,
|
|
"truncated": truncated,
|
|
})
|
|
|
|
except csv.Error as e:
|
|
return jsonify({"message": f"Ungültiges CSV: {e}"}), 400
|
|
except Exception as e:
|
|
logger.error(f"Fehler csvviewer: {e}")
|
|
return jsonify({"message": "Fehler beim Verarbeiten des CSV"}), 500
|