o
    w¨ÊhÒ0  ã                   @   s  d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZ dZdej d Zdej Zd	ej d
 ZdZdZdZdZdZG dd„ dejƒZG dd„ dejƒZG dd„ de	ƒZG dd„ deƒZ G dd„ deƒZ!G dd„ deƒZ"dS )zÊ
    pyexcel_io.readers.csvr
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    csv file reader

    :copyright: (c) 2014-2017 by Onni Software Ltd.
    :license: New BSD License, see LICENSE for more details
é    N)Ú
BookReader)ÚSheetReaderÚNamedContentÚ__z---%s---z%sz---%s:(.*)---z---%s:z%s---%sz
s   ÿþs   þfé   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚCSVMemoryMapIteratorz§
    Wrapper class for mmap object

    mmap object does not handle encoding at all. This class
    provide the necessary transcoding for utf-8, utf-16 and utf-32
    c                 C   sª   || _ || _d| _t| _|dkrd| _d S |dkrd| _d S |dkr'd| _d S |dks/|dkr7d| _t| _d S |d	krCd| _t| _d S |d
krOd| _t| _d S td| ƒ‚)Nr   úutf-8úutf-16r   úutf-32é   z	utf-32-bez	utf-16-bez	utf-32-lez	utf-16-lezEncoding %s is not supported)Ú_CSVMemoryMapIterator__mmap_objÚ_CSVMemoryMapIterator__encodingÚ_CSVMemoryMapIterator__countÚLITTLE_ENDIANÚ_CSVMemoryMapIterator__endianÚ*_CSVMemoryMapIterator__zeros_left_in_2_rowÚ
BIG_ENDIANÚ	Exception)ÚselfÚmmap_objÚencoding© r   úI/var/www/html/env/lib/python3.10/site-packages/pyexcel_io/readers/csvr.pyÚ__init__,   s(   





zCSVMemoryMapIterator.__init__c                 C   ó   | S ©Nr   ©r   r   r   r   Ú__iter__I   ó   zCSVMemoryMapIterator.__iter__c                 C   s¬   | j  ¡ }| jdkr$| jdkp| jdk}|r#|d d… }|tkr#t| _n| jtkr0|| jd … }| jtkr9| 	¡ }| 
| j¡}|  jd7  _|dkrLt‚tjrT| d¡}|S )Nr   r	   r
   é   r   Ú r   )r   Úreadliner   r   ÚBOM_BIG_ENDIANr   r   r   r   ÚrstripÚdecodeÚStopIterationÚcompactÚPY2Úencode)r   ÚlineÚ	utf_16_32Ú
bom_headerr   r   r   Ú__next__L   s(   

ÿ€


zCSVMemoryMapIterator.__next__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r,   r   r   r   r   r   $   s
    r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚUTF8RecorderzQ
    Iterator that reads an encoded stream and reencodes the input to UTF-8.
    c                 C   s   || _ t |¡|ƒ| _d S r   )Ú_UTF8Recorder__file_handleÚcodecsÚ	getreaderÚreader)r   Úfile_handler   r   r   r   r   j   s   zUTF8Recorder.__init__c                 C   s   | j  ¡  d S r   )r2   Úcloser   r   r   r   r7   n   s   zUTF8Recorder.closec                 C   r   r   r   r   r   r   r   r   q   r   zUTF8Recorder.__iter__c                 C   s   t | jƒ d¡}|S )Nr   )Únextr5   r(   )r   r)   r   r   r   r,   t   s   zUTF8Recorder.__next__N)r-   r.   r/   r0   r   r7   r   r,   r   r   r   r   r1   e   s    r1   c                   @   sR   e Zd ZdZ								ddd„Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Z	dS )ÚCSVSheetReaderz generic csv file readerr   TFNc
                 K   sN   t j| |fi |
¤Ž || _|| _|| _|| _|| _d | _|| _|| _	|	| _
d S r   )r   r   Ú	_encodingÚ _CSVSheetReader__auto_detect_intÚ"_CSVSheetReader__auto_detect_floatÚ _CSVSheetReader__ignore_infinityÚ%_CSVSheetReader__auto_detect_datetimeÚ_CSVSheetReader__file_handleÚ_CSVSheetReader__pep_0515_offÚ _CSVSheetReader__ignore_nan_textÚ"_CSVSheetReader__default_float_nan)r   Úsheetr   Úauto_detect_floatÚignore_infinityÚauto_detect_intÚauto_detect_datetimeÚpep_0515_offÚignore_nan_textÚdefault_float_nanÚkeywordsr   r   r   r   }   s   
zCSVSheetReader.__init__c                 C   s   t dƒ‚)z! return me unicde reader for csv z"Please implement get_file_handle())ÚNotImplementedErrorr   r   r   r   Úget_file_handle•   s   zCSVSheetReader.get_file_handlec                 C   s    |   ¡ | _tj| jfi | j¤ŽS r   )rM   r?   Úcsvr5   Ú	_keywordsr   r   r   r   Úrow_iterator™   s   
zCSVSheetReader.row_iteratorc                 c   s@   � |D ]}t jr| d¡}|d ur|dkr|  |¡}|V  qd S )Nr   r    )r&   r'   r$   Ú_CSVSheetReader__convert_cell)r   ÚrowÚelementr   r   r   Úcolumn_iterator�   s   €

ûzCSVSheetReader.column_iteratorc                 C   sˆ   d }| j rt || j¡}|d u r0| jr0tj|| j| j| jd�}|tdƒtdƒfv o+| j	}|r0d }|d u r<| j
r<t |¡}|d u rB|}|S )N)rI   rJ   Úinfz-inf)r;   ÚserviceÚdetect_int_valuer@   r<   Údetect_float_valuerA   rB   Úfloatr=   r>   Údetect_date_value)r   Úcsv_cell_textÚretÚshall_we_ignore_the_conversionr   r   r   Ú__convert_cell¥   s*   üÿþ
zCSVSheetReader.__convert_cellc                 C   s   | j r
| j  ¡  d S d S r   )r?   r7   r   r   r   r   r7   »   s   ÿzCSVSheetReader.close)r   TTTTTFN)
r-   r.   r/   r0   r   rM   rP   rT   rQ   r7   r   r   r   r   r9   z   s     
ör9   c                   @   ó   e Zd ZdZdd„ ZdS )ÚCSVFileReaderz read csv from phyical file c                 C   s@   d }t jrt| jjdƒ}t|| jƒ}|S t| jjd| jd�}|S )NÚrbÚr)r   )r&   r'   ÚopenÚ_native_sheetÚpayloadr1   r:   )r   Úunicode_readerr6   r   r   r   rM   Ç   s   ýÿzCSVFileReader.get_file_handleN©r-   r.   r/   r0   rM   r   r   r   r   r`   Ä   ó    r`   c                   @   r_   )ÚCSVinMemoryReaderz read csv file from memory c                 C   sv   d }t jrt| jjdƒrt| jj| jƒ}|S | jj}|S t| jjt jƒr5| jj 	¡ }t  
| | j¡¡}|S | jj}|S )NÚread)r&   r'   Úhasattrrd   re   r1   r:   Ú
isinstanceÚBytesIOrj   ÚStringIOr$   )r   rf   Úcontentr   r   r   rM   Ö   s"   
ÿòô
ÿþz!CSVinMemoryReader.get_file_handleNrg   r   r   r   r   ri   Ó   rh   ri   c                   @   sR   e Zd ZdZdd„ Zdd„ Zddd„Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚCSVBookReaderz read csv file c                 C   sB   t  | ¡ tj| _d | _d| _tj| _d | _	d | _
d| _g | _d S )NF)r   r   Ú	constantsÚFILE_FORMAT_CSVÚ
_file_typeÚ_file_contentÚ%_CSVBookReader__load_from_memory_flagÚDEFAULT_CSV_NEWLINEÚ_CSVBookReader__line_terminatorÚ_CSVBookReader__sheet_nameÚ_CSVBookReader__sheet_indexÚ_CSVBookReader__multiple_sheetsÚ_CSVBookReader__readersr   r   r   r   r   ò   s   

zCSVBookReader.__init__c                 K   s"   t j| |fi |¤Ž |  ¡ | _d S r   )r   rc   Ú_load_from_fileÚ_native_book)r   Ú	file_namerK   r   r   r   rc   ý   s   zCSVBookReader.openFc                 K   s(   t j| |fi |¤Ž || _|  ¡ | _d S r   )r   Úopen_streamrz   Ú_load_from_streamr}   )r   Úfile_streamÚmultiple_sheetsrK   r   r   r   r     s   zCSVBookReader.open_streamc                 K   s®   zBdd l }| dd¡}t||j ƒr)| dd¡| _t||ƒ| _|| _|  ¡ | _W d S t	j
r6t|tƒr6| |¡}tj| |fi |¤Ž W d S  tyV   tj| |fi |¤Ž Y d S w )Nr   r   r   r‚   F)ÚmmapÚgetrl   rz   r   Ú_file_streamrO   r€   r}   r&   Ú	PY3_ABOVEÚbytesr$   r   Úopen_contentÚImportError)r   Úfile_contentrK   rƒ   r   r   r   r   rˆ     s"   ÿ

þzCSVBookReader.open_contentc                 C   sF   | j rt|fi | j¤Ž}| ¡ S t|fi | j¤Ž}| j |¡ | ¡ S r   )ru   ri   rO   r`   r{   ÚappendÚto_array)r   Únative_sheetr5   r   r   r   Ú
read_sheet  s   þzCSVBookReader.read_sheetc                 C   s   | j D ]}| ¡  qd S r   )r{   r7   )r   r5   r   r   r   r7   %  s   

ÿzCSVBookReader.closec           
      C   sÞ   d| _ | j tj| j¡| _t| j }| jr[| j 	d¡ | j 
¡ }| |¡}g }|D ]/}|dkr0q)| | j¡}t tj|d ¡}d |dd… ¡}t| d¡t |¡ƒ}	| |	¡ q)|S t| jdƒrg| j 	d¡ t| j| jƒgS )z‚Load content from memory

        :params stream file_content: the actual file content in memory
        :returns: a book
        Tr   r    Ú
r   NÚseek)ru   rO   r„   rq   ÚKEYWORD_LINE_TERMINATORrw   Ú!DEFAULT_SHEET_SEPARATOR_FORMATTERrz   r…   r�   rj   ÚsplitÚreÚmatchÚSEPARATOR_MATCHERÚjoinr   Úgroupr&   rn   r‹   rk   rs   )
r   Ú	separatorro   ÚsheetsÚnamed_contentsrC   ÚlinesÚresultÚnew_contentÚ	new_sheetr   r   r   r€   )  s0   ÿ


ÿzCSVBookReader._load_from_streamc                 C   sú   | j  tj| j¡| _tj | j¡}d|d tj	tj	|d f }t
 
|¡}t|ƒdkr:tj | j¡}t|d | jƒgS d|d tj	tj	|d f }g }|D ]}t ||¡}| | d¡| d¡|f¡ qLg }	t|dd„ d	�D ]\}
}}|	 t|
|ƒ¡ qm|	S )
zqLoad content from a file

        :params str filename: an accessible file path
        :returns: a book
        z
%s%s*%s*%sr   r   éÿÿÿÿz%s%s(.*)%s(.*)%sr   c                 S   s   | d S )Nr   r   )rR   r   r   r   Ú<lambda>n  s    z/CSVBookReader._load_from_file.<locals>.<lambda>)Úkey)rO   r„   rq   r‘   rw   ÚosÚpathÚsplitextÚ
_file_nameÚDEFAULT_MULTI_CSV_SEPARATORÚglobÚlenr“   r   r”   r•   r‹   r˜   Úsorted)r   ÚnamesÚfilepatternÚfilelistÚ
file_partsÚmatcherÚtmp_file_listÚfilenr�   r\   Ú
lsheetnameÚindexr   r   r   r|   L  s<   ÿü
üÿzCSVBookReader._load_from_fileN)F)r-   r.   r/   r0   r   rc   r   rˆ   rŽ   r7   r€   r|   r   r   r   r   rp   ï   s    
#rp   )#r0   r”   r£   rN   r¨   r3   Úpyexcel_io.bookr   Úpyexcel_io.sheetr   r   Úpyexcel_io._compactÚ_compactr&   Úpyexcel_io.constantsrq   Úpyexcel_io.servicerV   ÚDEFAULT_SEPARATORÚDEFAULT_NAMEr’   r–   Ú!DEFAULT_CSV_STREAM_FILE_FORMATTERÚDEFAULT_NEWLINEÚBOM_LITTLE_ENDIANr"   r   r   ÚIteratorr   r1   r9   r`   ri   rp   r   r   r   r   Ú<module>   s6    	
ÿAJ