def METHOD_NAME(file: RawLittlepayFileExtract, fs):
    # mostly stolen from the Schedule job, we could probably abstract this
    # assume this is PSV for now, but we could sniff the delimiter
    filename, extension = os.path.splitext(file.filename)
    assert extension == ".psv"
    with fs.open(file.path) as f:
        reader = csv.DictReader(
            StringIO(f.read().decode("utf-8-sig")),
            restkey="calitp_unknown_fields",
            delimiter="|",
        )
    lines = [
        {**row, "_line_number": line_number}
        for line_number, row in enumerate(reader, start=1)
    ]
    jsonl_file = LittlepayFileJSONL(
        extract=file,
        filename=f"{filename}.jsonl.gz",
    )
    jsonl_file.save_content(
        content=gzip.compress("\n".join(json.dumps(line) for line in lines).encode()),
        fs=fs,
    )