разграничение карата А в питоне

У меня есть данные в форме:

37101000ssd48800^A1420asd938987^A2011-09-10^A18:47:50.000^A99.00^A1^A0^A
37101000sd48801^A44557asd03082^A2011-09-06^A13:24:58.000^A42.01^A1^A0^A

Итак, сначала я воспринял это буквально и попробовал:

line = line.split("^A")

а также

line = line.split("\\u001")

Итак, проблема в следующем:

Первый подход работает на моей локальной машине, если я сделаю это:

cat input.txt | python mapper.py 

Он отлично работает локально (input.txt — это указанные выше данные), но не работает на кластерах потоковой передачи Hadoop.

Кто-то сказал мне, что я должен использовать "\\u001" в качестве разделителя, но это тоже не работает ни на моей локальной машине, ни на кластерах.

Для пользователей хаупа:

Если я отлаживаю его локально, используя:

cat input.txt | python mapper.py | sort | python reducer.py

Это работает просто отлично, если я использую "^A" в качестве разделителя на локальном компьютере, но я получаю ошибки при работе в кластерах, и код ошибки также не слишком полезен...

Любые предложения о том, как я могу отладить это?
Спасибо.


person frazman    schedule 19.11.2012    source источник
comment
Попробуйте \x53. Это должно быть так же, как ^   -  person PearsonArtPhoto    schedule 20.11.2012
comment
Это не ясно из вашего вопроса: является ли разделитель элементом управления-A, который печатается как ^A во всем, что вы используете для перечисления своих данных, или это на самом деле знак вставки, за которым следует A? Если это первое, вам нужен line.split('\u001') (дополнительная обратная косая черта - вот почему это не работает для вас). Если последнее, line.split('^A').   -  person abarnert    schedule 20.11.2012
comment
@Pearsonartphoto: При каких именно обстоятельствах вы ожидаете, что '\x53' сработает, а '^' нет?   -  person abarnert    schedule 20.11.2012


Ответы (1)


Если в исходных данных в качестве разделителя используется элемент управления-A, и он просто печатается как ^A во всем, что вы используете для перечисления данных, у вас есть два варианта:

  1. Передайте все, что вы используете, список данных в скрипт Python, который использует split('^A').

  2. Просто используйте split('\u001'), чтобы разделить фактические значения элемента управления-A.

Последнее почти всегда будет тем, что вы действительно хотите. Причина, по которой у вас это не сработало, заключается в том, что вы написали split('\\u001'), избегая обратной косой черты, поэтому вы разделяете литеральную строку \u001, а не элемент управления-A.

Если исходные данные на самом деле имеют ^A (знак вставки, за которым следует A) в качестве разделителя, просто используйте split('^A').

person abarnert    schedule 19.11.2012