Как переместить данные из каждых 10 строк в одну строку? - PullRequest
0 голосов
/ 28 января 2019

Данные 2-й строки должны быть смещены рядом с данными 1-й строки. Это необходимо сделать для каждых 10 строк. Как и в случае, если набор данных представляет собой матрицу 20x10, он должен стать 2x100.

вход:
1 - ABCDEFG
2 - HIJKLMN
.
.
.
10 - OPQRSTU

Выход:
1 - ABCDEFGHIJKLMN.,,,,,,,OPQRSTU

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Предполагая, что вы хотите читать из файла, и что вы можете быть относительно новичком в Python, вот несколько примеров кода, которые вы можете просмотреть.Я попытался добавить достаточное количество комментариев и проверок безопасности, чтобы дать вам представление о том, как это работает и как вы можете его расширить.

Обратите внимание, что вам все еще нужно что-то делать с результатами в этой версии Python, яя бы настоятельно рассмотрел элегантный ответ @ Marcs, если бы вы могли просто использовать это.

Множество предположений, которые следует рассмотреть здесь.Насколько вы уверены, что в каждой строке одинаковое количество вещей?Я добавил некоторую логику, чтобы проверить это, и считаю, что скромно-параноидально, как это полезно.

Предполагая, что вы хотите читать из файла, вот пример программы, которую вы должны рассмотреть:

output

line_cnt=1 #things=3, line="a b c"
line_cnt=2 #things=3, line="d e f"
line_cnt=3 #things=3, line="g h i"
gathered 3 into=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
line_cnt=4 #things=3, line="j k l"
line_cnt=5 #things=3, line="m n o"
line_cnt=6 #things=3, line="p q r"
gathered 3 into=['j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']
line_cnt=7 #things=3, line="s t v"
line_cnt=8 #things=3, line="u w x"
line_cnt=9 #things=3, line="y z 0"
gathered 3 into=['s', 't', 'v', 'u', 'w', 'x', 'y', 'z', '0']
line_cnt=10 #things=3, line="1 2 3"
line_cnt=11 #things=3, line="4 5 6"
line_cnt=12 #things=3, line="7 8 9"
gathered 3 into=['1', '2', '3', '4', '5', '6', '7', '8', '9']
now have 4 rows
rows=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
['j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r']
['s', 't', 'v', 'u', 'w', 'x', 'y', 'z', '0']
['1', '2', '3', '4', '5', '6', '7', '8', '9']

Process finished with exit code 0

исходный код

import io

def join_dataset(f, nrows=10):
    temp_row = [ ]
    consolidated_rows = [ ]
    expected_row_size = None
    line_cnt = 0
    for line in f:
        line_cnt += 1 # want one-based line numbering so not using enumerate
        line = line.strip() # remove trailing newline
        things = line.split() # create list based on whitespace
        row_size = len(things) # check how long this row's list is
        if expected_row_size is None:
            expected_row_size = row_size # assume all same size as 1st row
        elif row_size != expected_row_size:
            raise ValueError('Expected {} things but found {}  on line# {}'.format(expected_row_size,row_size,line_cnt))
        print('line_cnt={} #things={}, line="{}"'.format(line_cnt, len(things), line))
         # read about append vs extend here https://stackoverflow.com/q/252703/5590742
        temp_row.extend(things)
        # check with %, the mod operator, 1%3 = 1, 2%3 = 2, 3%3 = 0 (even division), 4%3 = 1, 5%3 = 2, etc.
        # We're counting lines from 1, so if we get zero we have that many lines
        if 0 == (line_cnt % nrows):
            print('gathered {} into={}'.format(nrows,temp_row))
            # or write gathered to another file
            consolidated_rows.append(temp_row)
            temp_row = [ ] # start a new list
    if temp_row:
        # at end of file, but make sure we include partial results
        # (if you expect perfect alignment this would
        # be another good place for an error check.)
        consolidated_rows.append(temp_row)
    return consolidated_rows

test_lines="""a b c
d e f
g h i
j k l
m n o
p q r
s t v
u w x
y z 0
1 2 3
4 5 6
7 8 9"""
# if your data is in a file use:
# with open('myfile.txt', 'r') as f:
with io.StringIO(test_lines) as f:
    rows = join_dataset(f, nrows=3)
    # rows = join_dataset(f) # this will default to nrows=10
print('now have {} rows'.format(len(rows)))
print('rows={}'.format('\n'.join([str(row) for row in rows])))
0 голосов
/ 28 января 2019

Я понимаю, что вы пометили свой вопрос Python, но вот способ командной строки:

xargs -n10 -d'\n' < yourlistfile.txt

Где yourlistfile.txt - имя файла, который вы хотите проанализировать.

Команда, как написано, выведет на экран.Вы можете перенаправить этот вывод в новый файл, добавив его в конец этой команды: > your_results.txt, например:

xargs -n10 -d'\n' < yourlistfile.txt > reorganizedlistfile.txt

Ознакомьтесь с некоторыми другими идеями в этом посте: Как объединить каждыйдве строки в одну из командной строки?

Примечание: очевидно, некоторым версиям xargs не нравится эта опция -d, например, я получаю сообщение об ошибке в MacOS, говорящееопция не поддерживается.Но для простого примера, в котором токены разделены жестким возвратом, параметр разделителя все равно не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...