Split a worksheet into several worksheets

1

I have a spreadsheet with 5000 rows that needs to be split into spreadsheets with 790 rows at the most. How can I do this ??

    
asked by anonymous 26.05.2017 / 04:20

2 answers

3

Try to use the readlines function for file manipulation:

file = open('entrada.txt', 'r')
lines = file.readlines()
nfile = 0 # Numero para organizar os arquivos a serem criados, sera incrementado no loop for.
inicio = 0 # Inicio do trecho a ser escrito
fim = 0 # Fim do trecho
nlines = 790 # numero de linhas por arquivo 
rangeloop = len(lines)//nlines # numero de iterações a serem executadas no loop for
if len(lines) % nlines > 0: # Caso a conta nao dê exata, faz uma iteração a mais para escrever o que sobrou
    rangeloop += 1
for x in range(rangeloop):
    nfile += 1 
    fim += nlines
    arq = open("arq"+str(nfile)+".txt", 'w')
    arq.write(''.join(lines[inicio:fim]))
    inicio = fim
    arq.close()

It worked right here, try there and tell me, any questions you can ask, it's badly written because I did it very fast.

    
26.05.2017 / 05:26
2
  

Comment : This question is meant to be an answer in Python, but I believe that this answer in bash can bring new ares and also serves as a curiosity

To make a proper textual treatment in bash , I'm assuming the spreadsheet was exported to the CSV , where each row in the worksheet ends with a \n in the CSV file.

The idea is to play a set of lines in different files. Starting at line 0, the file will end at line 4999. Thus, lines 0-789 will be in the first file, 790-1579 would be in the second file, and so on. To identify which file the n line belongs to, just make the whole division and add 1: (n / 790) + 1 .

So, come on. We will read from the planilhao.csv file and play in the planilhinha-I.csv files, where I is the index of the file. As previously mentioned, the n line enters the file with index I = (n / 790) + 1 . Given the general directions of the strategy to follow, let's build the script.

The first part of the strategy is to identify, for each line, what your number is. The following script does this reading / number assignment:

# o número da linha é um inteiro
declare -i line_no=0

while read LINHA; do
    # esse echo aqui é só para demonstrar a associação entre a linha lida e o line_no
    echo "linha $line_no, conteúdo ($LINHA)"

    # incremento o número da linha
    line_no+=1
done

To demonstrate the calculation of I , considering n_lines the maximum number of lines per file:

# o número da linha é um inteiro
declare -i line_no=0

# número máximo de linhas por arquivo
n_lines=790

while read LINHA; do
    # cálculo do índice do arquivo
    index=$(( (line_no / n_lines) + 1 ))

    # esse echo aqui é só para demonstrar a associação entre o line_no e o index
    echo "linha $line_no, arquivo índice $index, conteúdo ($LINHA)"

    # incremento o número da linha
    line_no+=1
done

So, knowing the index in which each line goes, we can throw the line to the appropriate file:

# o número da linha é um inteiro
declare -i line_no=0

# número máximo de linhas por arquivo
n_lines=790

# prefixo do nome do arquivo
file_prefix=planilhinha

while read LINHA; do
    # cálculo do índice do arquivo
    index=$(( (line_no / n_lines) + 1 ))

    # nome do arquivo
    file_name="${file_prefix}-${index}.csv"

    # anexa a linha ao arqvuio 
    echo "$LINHA" >> "$file_name"

    # incremento o número da linha
    line_no+=1
done

So, that's it. Put this script in a file ( separador_planilha.sh for example) and send it the file you want to separate. The command would look like this:

./separador_planilha.sh < planilhao.csv
    
26.05.2017 / 05:47