
    01i5A              
         % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKJrJrJrJrJrJr  SSKJr  SSKrSSKJrJrJr  SSKJr  S/rS	r0 rS
\ S'   S1S jr!S r"S2S jr#\RH                  4S jr%S3S4S jjr& " S S5      r' " S S\'5      r( " S S\'5      r) " S S\)5      r* " S S\)5      r+ " S S\)5      r, " S S\'5      r- " S S \)5      r. " S! S"\'5      r/\'" 5       r0S# r1S5S$ jr2S% r3S3S& jr4S' r5S3S( jr6S3S) jr7S* r8S5S+ jr9\1\2\3\4\6\8\9\5\7S,.	r:S- r; " S. S5      r<S/ r=\>S0:X  a  \=" 5         gg)6z
A commandline tool for semi-automatically converting CSV to RDF.

See also https://github.com/RDFLib/pyTARQL in the RDFlib family of tools

try: `csv2rdf --help`
    )annotationsN)AnyDictListOptionalTupleUnion)quote)RDFRDFS	split_uri)URIRefCSV2RDFa^  
csv2rdf.py     -b <instance-base>     -p <property-base>     [-D <default>]     [-c <classname>]     [-i <identity column(s)>]     [-l <label columns>]     [-s <N>] [-o <output>]     [-f configfile]     [--col<N> <colspec>]     [--prop<N> <property>]     <[-d <delim>]     [-C] [files...]"

Reads csv files from stdin or given files
if -d is given, use this delimiter
if -s is given, skips N lines at the start
Creates a URI from the columns given to -i, or automatically by numbering if
none is given
Outputs RDFS labels from the columns given to -l
if -c is given adds a type triple with the given classname
if -C is given, the class is defined as rdfs:Class
Outputs one RDF triple per column in each row.
Output is in n3 format.
Output is stdout, unless -o is specified

Long options also supported:     --base,     --propbase,     --ident,     --class,     --label,     --out,     --defineclass

Long options --col0, --col1, ...
can be used to specify conversion for columns.
Conversions can be:
    ignore, float(), int(), split(sep, [more]), uri(base, [class]), date(format)

Long options --prop0, --prop1, ...
can be used to use specific properties, rather than ones auto-generated
from the headers

-D sets the default conversion for columns not listed

-f says to read config from a .ini/config file - the file must contain one
section called csv2rdf, with keys like the long options, i.e.:

[csv2rdf]
out=output.n3
base=http://example.org/
col0=split(";")
col1=split(";", uri("http://example.org/things/",
                    "http://xmlns.com/foaf/0.1/Person"))
col2=float()
col3=int()
col4=date("%Y-%b-%d %H:%M:%S")

z*Dict[Any, Tuple[URIRef, Optional[URIRef]]]urisc                   [         R                  " SSU 5      n [         R                  " SSU 5      n U R                  S5      n SR                  U S   R	                  5       /U SS  Vs/ s H  oR                  5       PM     sn-   5      $ s  snf )	zS
CamelCase + lowercase initial a string


FIRST_NM => firstNm

firstNm => firstNm

z[^\w] z([a-z])([A-Z])z\1 \2 r      N)resubsplitjoinlower
capitalize)labelxs     N/home/james-whalen/.local/lib/python3.13/site-packages/rdflib/tools/csv2rdf.py
toPropertyr   `   su     FF8S%(EFF#Y6EKKE77E!HNN$%qr(KA(KKLL(Ks   'B	
c                h    U SS R                  5       (       d  U SS R                  5       U SS  -   $ U $ )Nr      r   )isupperr   )r   s    r   toPropertyLabelr"   q   s<    1:Qqz!E!"I--L    c                H    [        U Vs/ s H  o U   PM	     sn5      $ s  snf )zDreturn a set of indexes from a list
>>> index([1,2,3],(0,2))
(1, 3)
)tuple)l_ir   s      r   indexr(   w   s#    
 #AQ%#$$#s   c              +  X   #    [         R                  " U 4SU0UD6nU H  nUv   M	     g 7f)Ndialect)csvreader)csv_datar*   kwargs
csv_readerrows        r   r/   r/      s,     H@g@@J	 s   (*c           	         U(       aA  [         R                  " U[        U R                  S5      R	                  SS5      SS9-   5      nO[         R                  " U 5      nX24[
        U '   U$ )Nutf8r   _r   safe)rdflibr   r
   encodereplacer   )r   prefixclass_rs       r   	prefixurir<      sT    MM&5&)9)A)A#s)KRT#UUVMM!kDGHr#   c                  $    \ rS rSrS rSS jrSrg)	NodeMaker   c                6    [         R                  R                  $ N)r6   r   Literalselfs    r   rangeNodeMaker.range   s    {{"""r#   c                .    [         R                  " U5      $ rA   )r6   rB   rD   r   s     r   __call__NodeMaker.__call__   s    ~~a  r#    N)r   r   )__name__
__module____qualname____firstlineno__rE   rI   __static_attributes__rK   r#   r   r>   r>      s    #!r#   r>   c                  &    \ rS rSrS rS rS rSrg)NodeUri   c                r    S U l         Xl        U(       a  [        R                  " U5      U l         g S U l         g rA   )r:   r9   r6   r   )rD   r9   r:   s      r   __init__NodeUri.__init__   s(    (, --/DKDKr#   c                B    [        XR                  U R                  5      $ rA   )r<   r9   r:   rH   s     r   rI   NodeUri.__call__   s    KK55r#   c                \    U R                   =(       d    [        R                  R                  $ rA   )r:   r6   r   ResourcerC   s    r   rE   NodeUri.range   s    {{1fjj111r#   )r:   r9   NrL   rM   rN   rO   rU   rI   rE   rP   rK   r#   r   rR   rR      s    62r#   rR   c                      \ rS rSrSS jrSrg)NodeLiteral   Nc                    Xl         g rA   f)rD   rb   s     r   rU   NodeLiteral.__init__   s    r#   ra   rA   )rL   rM   rN   rO   rU   rP   rK   r#   r   r^   r^      s    r#   r^   c                       \ rS rSrS rS rSrg)	NodeFloat   c                   U R                   (       d  [        R                  " [        U5      5      $ [	        U R                   5      (       a.  [        R                  " [        U R                  U5      5      5      $ [        S5      e)Nz(Function passed to float is not callable)rb   r6   rB   floatcallable	ExceptionrH   s     r   rI   NodeFloat.__call__   sS    vv>>%(++DFF>>%q	"233BCCr#   c                6    [         R                  R                  $ rA   )r6   XSDdoublerC   s    r   rE   NodeFloat.range   s    zz   r#   rK   NrL   rM   rN   rO   rI   rE   rP   rK   r#   r   re   re      s    D!r#   re   c                       \ rS rSrS rS rSrg)NodeInt   c                   U R                   (       d  [        R                  " [        U5      5      $ [	        U R                   5      (       a.  [        R                  " [        U R                  U5      5      5      $ [        S5      e)Nz&Function passed to int is not callable)rb   r6   rB   intri   rj   rH   s     r   rI   NodeInt.__call__   sR    vv>>#a&))DFF>>#dffQi.11@AAr#   c                6    [         R                  R                  $ rA   )r6   rm   ru   rC   s    r   rE   NodeInt.range   s    zz~~r#   rK   Nrp   rK   r#   r   rr   rr      s    Br#   rr   c                       \ rS rSrS rS rSrg)NodeBool   c                   U R                   (       d  [        R                  " [        U5      5      $ [	        U R                   5      (       a.  [        R                  " [        U R                  U5      5      5      $ [        S5      e)Nz'Function passed to bool is not callable)rb   r6   rB   boolri   rj   rH   s     r   rI   NodeBool.__call__   sR    vv>>$q'**DFF>>$tvvay/22ABBr#   c                6    [         R                  R                  $ rA   )r6   rm   r}   rC   s    r   rE   NodeBool.range   s    zzr#   rK   Nrp   rK   r#   r   rz   rz      s    Cr#   rz   c                       \ rS rSrS rS rSrg)NodeReplace   c                    Xl         X l        g rA   ab)rD   r   r   s      r   rU   NodeReplace.__init__   s    r#   c                N    UR                  U R                  U R                  5      $ rA   )r8   r   r   rH   s     r   rI   NodeReplace.__call__   s    yy((r#   r   N)rL   rM   rN   rO   rU   rI   rP   rK   r#   r   r   r      s    )r#   r   c                       \ rS rSrS rS rSrg)NodeDate   c                |    [         R                  " [        R                  R                  XR                  5      5      $ rA   )r6   rB   datetimestrptimerb   rH   s     r   rI   NodeDate.__call__   s&    ~~h//88FFCDDr#   c                6    [         R                  R                  $ rA   )r6   rm   dateTimerC   s    r   rE   NodeDate.range   s    zz"""r#   rK   Nrp   rK   r#   r   r   r      s    E#r#   r   c                  &    \ rS rSrS rS rS rSrg)	NodeSplit   c                    Xl         X l        g rA   seprb   )rD   r   rb   s      r   rU   NodeSplit.__init__   s    r#   c                ^   U R                   (       d  [        R                  U l         [        U R                   5      (       d  [	        S5      eUR                  U R                  5       Vs/ s H7  o"R                  5       S:w  d  M  U R                  UR                  5       5      PM9     sn$ s  snf )Nz)Function passed to split is not callable!r   )rb   r6   rB   ri   rj   r   r   strip)rD   r   ys      r   rI   NodeSplit.__call__   sr    vv^^DFGHH+,77488+<P+<a	R!qwwy!+<PPPs   )B*#B*c                    U R                   (       a9  [        U R                   [        5      (       a  U R                   R                  5       $ [        R                  U 5      $ rA   )rb   
isinstancer>   rE   rC   s    r   rE   NodeSplit.range   s8    66j3366<<>!t$$r#   )rb   r   Nr\   rK   r#   r   r   r      s    Q%r#   r   c                     g)NignorerK   )argsr.   s     r   _config_ignorer      s    r#   c                    [        X5      $ rA   )rR   )r9   r:   s     r   _config_urir      s    6""r#   c                     [        5       $ rA   )r^   rK   r#   r   _config_literalr      s
    =r#   c                    [        U 5      $ rA   )re   ra   s    r   _config_floatr     s    Q<r#   c                    [        X5      $ rA   )r   r   s     r   _config_replacer     s    qr#   c                    [        U 5      $ rA   )rr   ra   s    r   _config_intr     s    1:r#   c                    [        U 5      $ rA   )rz   ra   s    r   _config_boolr     s    A;r#   c                    [        U 5      $ rA   )r   )format_s    r   _config_dater     s    Gr#   c                    [        X5      $ rA   )r   r   s     r   _config_splitr     s    Sr#   )	r   uriliteralrh   ru   dater   r8   r}   c                "    [        U [        5      $ )z$Return a function for column mapping)evalconfig_functions)vs    r   columnr   )  s     #$$r#   c                  &    \ rS rSrS rS rS rSrg)r   i/  c                    S U l         S U l        S U l        SU l        S U l        SU l        SU l        SU l        S U l        0 U l	        0 U l
        [        R                  U l        SU l        g )NautoFr   ,)CLASSBASEPROPBASEIDENTLABELDEFINECLASSSKIPDELIMDEFAULTCOLUMNSPROPSsysstdoutOUTtriplesrC   s    r   rU   CSV2RDF.__init__0  sb    
	28

 	

::r#   c                    U R                   R                  UR                  5       < SUR                  5       < SUR                  5       < S35        U =R                  S-  sl        g )Nr   z .
r   )r   writen3r   )rD   spos       r   tripleCSV2RDF.tripleB  s9    @Ar#   c                R   [         R                   " 5       nU R                  (       a6  [        R                  R	                  SU R                  R
                  -  5        U R                  S:w  a1  [        U R                  [        5      (       d  U R                  4U l        U R                  (       d1  [        R                  " S5        [        R                  " S5      U l	        U R                  (       d1  [        R                  " S5        [        R                  " S5      U l        [        U R                   5       H  n[#        U5        M     [%        [#        U5      5      n['        [)        U Vs/ s H  o0R                  [+        U5         PM     sn5      5      nU R,                  R/                  5        H  u  pgXuU'   [1        U5      S   XF'   M     U R2                  (       Ga{  U R5                  U R6                  [8        R:                  [<        R>                  5        [        [A        U5      5       GH)  nXX   XH   pU	S:X  d  U
S:X  a  M  U RB                  RE                  XRF                  5      S	:X  a  MD  U R5                  U	[8        R:                  [8        RH                  5        U R5                  U	[<        RJ                  [        RL                  " [O        U
5      5      5        U R5                  U	[<        RP                  U R6                  5        U R5                  U	[<        R                  U RB                  RE                  U[R        5      R                  5       5        GM,     S
nU GH\  n
 U R                  S:X  a  U R                  SU-     nOiU R                  SRU                  [W        XR                  5       Vs/ s H,  n[Y        UR[                  S5      R]                  SS5      SS9PM.     sn5         nU R^                  (       aW  U R5                  U[<        RJ                  [        RL                  " SRU                  [W        XR^                  5      5      5      5        U R6                  (       a+  U R5                  U[8        R:                  U R6                  5        [)        U
5       H  u  pURa                  5       nUS:w  d  M  U RB                  RE                  XRF                  5      S	:X  a  MH   U RB                  RE                  U[        RL                  5      " U5      n[        U[$        5      (       a   U H  nU R5                  XU   U5        M     M  U R5                  XU   U5        M     US-  nUS-  S
:X  aG  [        R                  R	                  SXRf                  [         R                   " 5       U-
  4-  5        GM\  GM_     [i        5       n[j        R/                  5        H  u  pUu  nnU R5                  U[<        RJ                  [        RL                  " U
5      5        U(       d  MH  [        Rl                  " U5      nURo                  U5        U R5                  U[8        R:                  U5        M     U H2  nU R5                  U[8        R:                  [<        R>                  5        M4     U R                  Rq                  5         [        R                  R	                  SXRf                  4-  5        [        R                  R	                  S[         R                   " 5       U-
  -  5        g s  snf s  snf ! [b         a7  n[        R                  " SSXU   XRd                  4-  -   5         S nAGM  S nAff = f! [b         a$    [        R                  R	                  SU-  5        e f = f)NzOutput to %s
r   z2No base given, using http://example.org/instances/zhttp://example.org/instances/z:No property base given, using http://example.org/property/zhttp://example.org/props/r   r   r   r   z%dr3   r2   r   r4   z#Could not process value for column z%d:%s in row %d, ignoring: %s i z$%d rows, %d triples, elapsed %.2fs.
zError processing line: %d
z#Converted %d rows into %d triples.
zTook %.2f seconds.
)9timer   r   stderrr   namer   r   r%   r   warningswarnr6   	Namespacer   rE   r   nextlistdict	enumerater   r   itemsr   r   r   r   r   typer   Classlenr   getr   Propertyr   rB   r"   domaindefault_node_maker   r(   r
   r7   r8   r   r   rj   messager   setr   r   addclose)rD   	csvreaderstartr   header_labelsheaderskr   r'   hr&   rowsr   r   _oeclassesucs                      r   convertCSV2RDF.convertF  ss   		88JJ-=>::
4::u(E(E**DJyyMMNO(()HIDI}}MMVW",,-HIDM tyy!AO " T)_-y!V1--
1">!VWXJJ$$&DAAJ(|AM ' KK

CHHdjj93w<(
M$427bBh<<##A||4@Asxx6Atzz6>>/":M+NOAt{{DJJ7tzz4<<#3#3A7H#I#O#O#Q ) B9::'))D4K0C))
 */r::)>	 *?A !&ahhv&6&>&>sC&Hr R)>		C ::KK

sxxb**0E'FG	 ::KKSXXtzz:%bMDA	ABw<<++A||<H$ $ 0 0FNN CA FA)!T22*+B$(KKQZ$D +, !%CQ ? *, 	&=A%JJ$$?tyy{U/BCD &g z %ZZ\EBDAqKK4::v~~b'9:qMM!$AAsxx+ " AKK388TZZ0  	

?4BVVW

/499;3FGHQ "W<F  ) $MM E"B#$aj$		"B#C!C   

  !>!EFsd   +!\*$A]843\/'C]8<+]8(A#\4]8\4"A]8/]84
]5>+]0)]80]55]88.^&)r   r   r   r   r   r   r   r   r   r   r   r   r   N)rL   rM   rN   rO   rU   r   r   rP   rK   r#   r   r   r   /  s    $Ir#   c                 
   [        5       n [        R                  " [        R                  SS  S/ SQ5      u  p[	        U5      nSU;   d  SU;   a%  [        [        5        [        R                  " S5        SU;   Ga  [        R                  " 5       nUR                  [        US   5      5        UR                  S5       GH  u  pEUS	:X  a  [        R                  " US
S5      U l        M+  US:X  a  [        R                   " U5      U l        MN  US:X  a  [        R                   " U5      U l        Mq  US:X  a  [        R&                  " U5      U l        M  US:X  a  [+        U5      U l        M  US:X  a  [/        U5      U l        M  US:X  a  [/        U5      U l        M  US:X  a  XPl        M  US:X  a  [7        U5      U l        GM  US:X  a  [;        U5      U l        GM  UR?                  S5      (       a'  [;        U5      U R@                  [7        USS  5      '   GMY  UR?                  S5      (       d  GMr  [        R&                  " U5      U RB                  [7        USS  5      '   GM     SU;   a   [        R                  " US   S
S5      U l        SU;   a   [        R                  " US   S
S5      U l        SU;   a  [        R                   " US   5      U l        SU;   a  [        R                   " US   5      U l        SU;   a
  US   U l        SU;   a
  US   U l        SU;   a  [;        US   5      U l        S U;   a  [;        US    5      U l        S!U;   a  [        R                   " US!   5      U l        S"U;   a  [        R                   " US"   5      U l        S#U;   a  [/        US#   5      U l        S$U;   a  [/        US$   5      U l        S%U;   a  [/        US%   5      U l        S&U;   a  [/        US&   5      U l        S'U;   a  [7        US'   5      U l        S(U;   a  [7        US(   5      U l        S)U;   a  [        R&                  " US)   5      U l        S*U;   a  [        R&                  " US*   5      U l        UR                  5        H  u  pEUR?                  S+5      (       a&  [;        U5      U R@                  [7        US,S  5      '   MA  UR?                  S-5      (       d  MY  [        R&                  " U5      U RB                  [7        US.S  5      '   M     U R(                  (       a  S/U;   d  S0U;   a  S1U l        U RE                  [G        [H        RJ                  " U5      U R4                  S295        g )3Nr   zhc:b:p:i:o:Cf:l:s:d:D:)
zout=zbase=zdelim=z	propbase=zclass=zdefault=ident=zlabel=zskip=defineclasshelpz-hz--helpz-fcsv2rdfoutwzutf-8basepropbaseclassr  identr   delimskipdefaultcol   prop   z-oz--outz-bz--basez-dz--delimz-Dz	--defaultz-pz
--propbasez-lz--labelz-iz--identz-sz--skipz-cz--classz--col   z--prop   z-Cz--defineclassT)	delimiter)&r   getoptr   argvr   printHELPexitconfigparserConfigParser	read_fileopenr   codecsr   r6   r   r   r   r   r   r}   r   r   r   r   r   ru   r   r   r   
startswithr   r   r   r/   	fileinputinput)r  optsfilesconfigr   r   s         r   mainr&    s@   iG -- 	
KD  :Dt|x4'dt|**,d4j)*LL+DAEz$kk!S':f%//2j#)#3#3A#6 g &a 0m#&*1g#g $Qg $Qg !f"1vi"()e$$.4QiAabE
+f%%,2MM!,<c!AB%j)1 ,4 t|kk$t*c7;$kk$w-g>t|''T
34''X7t|T
DYt| d,d k!23t|!++DJ7t!++D,>?t|T$Z(DT)_-t|T$Z(DT)_-t|4:44>*t|d4j1Dd9o6

<<  *0)GOOC!"J'\\(##(.a(8GMM#ae*%	  }}$$,/T*A"OOJyu5OPr#   __main__)r   str)r&   z	List[int]r'   Tuple[int, ...]returnr)  rA   )r:   zOptional[URIRef])NN)?__doc__
__future__r   r  r  r+   r   r!  r  r   r   r   r   typingr   r   r   r   r   r	   urllib.parser
   r6   rdflib.namespacer   r   r   rdflib.termr   __all__r  r   __annotations__r   r"   r(   excelr/   r<   r>   rR   r^   re   rr   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&  rL   rK   r#   r   <module>r4     sw   #   
    	 
   : :   1 1 +<~ 460 5M"% "% ! !2i 2 ) 
	! 	!	k 		{ 	)) )#{ #%	 %$ K #
 
 %VI VIrmQ` zF r#   