Thanks :)
It works now ( bean-extract config.py Revolut-CHF.myname.csv) with this
config.py:
import os, sys
# beancount doesn't run from this directory
sys.path.append(os.path.dirname(__file__))
# importers located in the importers directory
from importers import revolut
CONFIG = [
revolut.Importer('/Revolut-CHF.*\.csv',
'Assets:MyName:Liquidity:Revolut:CHF', 'CHF'),
]
Would it be possible the use some regex to change the category if in the
revolut statement is a description with "*Restaurant *"?
Thanks for the help:)
On Saturday, November 16, 2019 at 5:03:15 PM UTC+1, Patrick Ruckstuhl wrote:
>
> Hi,
>
>
> sure. I'm using smart_importer so you can leave that out if you don't use
> it
>
>
> import sys
> from os import path
> sys.path.insert(0, path.join(path.dirname(__file__)))
>
> from importers.revolut import importer as revolutimp
>
> from beancount.ingest import extract
> from smart_importer import apply_hooks, PredictPostings
> from smart_importer.detector import DuplicateDetector
>
> CONFIG = [
> apply_hooks(revolutimp.Importer('/Revolut-CHF.*\.csv',
> 'Assets:Patrick:Liquidity:Revolut:CHF', 'CHF'), [PredictPostings(),
> DuplicateDetector()]),
> apply_hooks(revolutimp.Importer('/Revolut-GBP.*\.csv',
> 'Assets:Patrick:Liquidity:Revolut:GBP', 'GBP'), [PredictPostings(),
> DuplicateDetector()]),
> apply_hooks(revolutimp.Importer('/Revolut-USD.*\.csv',
> 'Assets:Patrick:Liquidity:Revolut:USD', 'USD'), [PredictPostings(),
> DuplicateDetector()]),
> apply_hooks(revolutimp.Importer('/Revolut-EUR.*\.csv',
> 'Assets:Patrick:Liquidity:Revolut:EUR', 'EUR'), [PredictPostings(),
> DuplicateDetector()]),
> ]
>
> extract.HEADER = ''
>
>
> On 16.11.2019 16:52, [email protected] <javascript:> wrote:
>
> Thanks :)
> This is for "bean-extract", right?
> Can you also provide me the correct entry for the config.py?
>
>
>
> On Saturday, November 16, 2019 at 3:58:14 PM UTC+1, Patrick Ruckstuhl
> wrote:
>>
>> Hi,
>>
>>
>> That's what I'm currently using. It stores original values as meta
>> information in original key and conversions as originalIn and originalOut
>>
>> from dateutil.parser import parse
>> from io import StringIO
>>
>> from beancount.ingest import importer
>> from beancount.core import data
>> from beancount.core import amount
>> from beancount.core.number import D
>> from beancount.ingest.importers.mixins import identifier
>>
>> import csv
>>
>> class Importer(identifier.IdentifyMixin, importer.ImporterProtocol):
>> """An importer for Revolut CSV files."""
>>
>> def __init__(self, regexps, account, currency):
>> identifier.IdentifyMixin.__init__(self, matchers=[
>> ('filename', regexps)
>> ])
>> self.account = account
>> self.currency = currency
>>
>> def name(self):
>> return super().name() + self.account
>>
>> def file_account(self, file):
>> return self.account
>>
>> def extract(self, file, existing_entries):
>> entries = []
>>
>> with StringIO(file.contents()) as csvfile:
>> reader = csv.DictReader(csvfile, ['Date',
>> 'Reference','PaidOut', 'PaidIn', 'ExchangeOut', 'ExchangeIn', 'Balance',
>> 'Category', 'Notes'], delimiter=';', skipinitialspace=True)
>> next(reader)
>> for row in reader:
>> metakv = {
>> 'category': row['Category'].strip(),
>> }
>> exchangeIn = row['ExchangeIn'].strip()
>> exchangeOut = row['ExchangeOut'].strip()
>> if exchangeIn and exchangeOut:
>> metakv['originalIn'] = exchangeIn
>> metakv['originalOut'] = exchangeOut
>> elif exchangeIn:
>> metakv['original'] = exchangeIn
>> elif exchangeOut:
>> metakv['original'] = exchangeOut
>>
>> meta = data.new_metadata(file.name, 0, metakv)
>> entry = data.Transaction(
>> meta,
>> parse(row['Date'].strip()).date(),
>> '*',
>> '',
>> (row['Reference'].strip() + ' ' +
>> row['Notes'].strip()).strip(),
>> data.EMPTY_SET,
>> data.EMPTY_SET,
>> [
>> data.Posting(self.account,
>> amount.Amount(D(row['PaidIn'].strip()) - D(row['PaidOut'].strip()),
>> self.currency), None, None, None, None),
>> ]
>> )
>> entries.append(entry)
>> return entries
>>
>>
>> On 16.11.2019 14:45, [email protected] wrote:
>>
>> Hi
>>
>> Does anybody has a Revolut statement (csv) parser to import the
>> transactions to beancounts?
>>
>> Example rows:
>>
>> Completed Date ; Description ; Paid Out (CHF) ; Paid In (CHF) ; Exchange
>> Out; Exchange In; Balance (CHF); Category; Notes
>> Nov 16, 2019 ; Top-Up by *8753 ; ; 600.00 ; ; ; 703.83; general;
>> Nov 16, 2019 ; Paypal *collintanaw FX Rate Fr1 = US$1.0066 ; 403.30 ; ;
>> USD 405.96 ; ; 103.83; services;
>>
>> Thanks for help :)
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Beancount" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/beancount/90613531-9c08-45a5-8dfc-7be50029c224%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/beancount/90613531-9c08-45a5-8dfc-7be50029c224%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> --
> You received this message because you are subscribed to the Google Groups
> "Beancount" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected] <javascript:>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/beancount/31a28fff-21f2-4005-a1a9-bfb7efd41696%40googlegroups.com
>
> <https://groups.google.com/d/msgid/beancount/31a28fff-21f2-4005-a1a9-bfb7efd41696%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
>
--
You received this message because you are subscribed to the Google Groups
"Beancount" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/beancount/58ad6d89-1eb3-4ca3-8a8a-b3d96217e080%40googlegroups.com.