Нужен несложный парсер.

Discussion in 'PHP' started by fasty, 19 Jul 2009.

  1. fasty

    fasty Member

    Joined:
    9 May 2008
    Messages:
    0
    Likes Received:
    6
    Reputations:
    -10
    Вобщем нужно из такого вида акков:
    mail@mail.ru
    password
    -----------------
    Сделать

    mail@mail.ru:password


    Кто сможет помогите,заранее благодарен.
     
  2. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Вид файла:
    Code:
    мыло1
    пасс1
    мыло2
    пасс2
    ?
     
    1 person likes this.
  3. fasty

    fasty Member

    Joined:
    9 May 2008
    Messages:
    0
    Likes Received:
    6
    Reputations:
    -10
    мыло1
    пасс1

    мыло2
    пасс2

    мыло3
    пасс3
     
  4. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    PHP:
    <?php

    $i 
    1;
    foreach (
    file('mails.txt') as $line)
    {
        
    $line trim($line);
        if (
    $line)
        {
            
    $i++;
            if (!(
    $i 2))
                echo 
    $line;
            else
                echo 
    ';' $line "<br>\r\n";
        }
    }

    ?>
    Без использования регулярок, прочих функций - только цикл и эхо.
     
    1 person likes this.
  5. fasty

    fasty Member

    Joined:
    9 May 2008
    Messages:
    0
    Likes Received:
    6
    Reputations:
    -10
    Спасибо большое.
     
  6. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Я опоздал :(
    Хотя у mailbrush'a, по-моему, что-то не то :)
    added: у него все то, просто я кривой :(

    Code:
    #!/usr/bin/env python3
    
    import sys
    
    filename = sys.argv[1]
    emails = []
    passwords = []
    tmp = 1
     
    for line in open(filename):
        if line.strip():
            emails.append(line.strip()) if tmp % 2 == 1 else passwords.append(line.strip())
            tmp += 1
                
    for i in range(len(emails)):
        temp = emails[i] + ':' + passwords[i]
        print(temp, file = open("out.txt", "a"))
    in.txt
    Code:
    lala@mail.ru
    password1
    
    coco@mail.ru
    password2
    
    kaka@mail.ru
    password3
    out.txt
    Code:
    lala@mail.ru:password1
    coco@mail.ru:password2
    kaka@mail.ru:password3
    сделал чуть короче (
     
    #6 Fata1ex, 19 Jul 2009
    Last edited: 19 Jul 2009
    1 person likes this.
  7. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Fata1ex, мой работает :)
    added: не увидел added :)
     
  8. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    Code:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import sys
    # Водной файл берем либо из параметра при запуске скрипта, либо по дефолту input.txt
    # Запис производиться в файл output.txt
    try:
    	filename = sys.argv[1]
    	print "Используется файл с данными " + filename,
    except IndexError:
    	print "Испольуется стандартный файл с данными input.txt",
    	filename="input.txt"
    
    try:
    	f1 = open(filename, "r")
    	f2 = open("output.txt", "w")
    except IOError:
    	print "Чёта я файл открыть немогу :("
    	exit(1)
    
    while 1:
      	f2.write(f1.readline()[0:-1] + ':' + f1.readline())
      	print temp,
      	sNull = f1.readline()
      	if not sNull:
      		break
      	
    f2.close()
    f1.close()
    Вход
    Code:
    AdfsdA
    222222
    
    BsfsddfB
    444444
    
    CgjjjfggdfC
    444444
    Выход:
    Code:
    AdfsdA:222222
    BsfsddfB:444444
    CgjjjfggdfC:444444
    Чем он лучьше скрипта написанного Fata1ex:
    1.
    Code:
    for line in open(filename):
        if line.strip():
            emails.append(line.strip()) if tmp % 2 == 1 else passwords.append(line.strip())
            tmp += 1
    Объем используемой оперативки на прямую хависит от объема вхоного файла - это Бэд
    2.
    Code:
    for i in range(len(emails)):
        temp = emails[i] + ':' + passwords[i]
        print(temp, file = open("out.txt", "a"))
    Зачем столько раз открывать файл на дозапись ?

    PHP незнаю, так что тут молчу.
    PS. все сделано исключительно в образовательных целях, и только ради интереса
     
  9. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Ну или самый короткий вариант:
    PHP:
    <?php

    $i 
    1;
    foreach (
    file('mails.txt') as $line)
    {
        
    $line trim($line);
        if (
    $line)
        {
            
    $i++;
            echo 
    $i ';' $line "<br>\r\n" $line;
        }
    }

    ?>
     
  10. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    cupper, ты не прав насчет первой претензии к фаталексу, он не читает файл в оперативку, конструкция open(filename) не читает файл, а получает хэндлер на него, а когда он делат for line in filehandler то там идет итератор и построчное чтение, так что это пох :D, насчет второго - это маленькие слабости py3k , там поправить -дело пары сек, нужно просто в print передавать хэндлер, но это так лирика :D
    И раз уж меряетесь пиписьками, то всуну и я свою кривую реализацию

    Code:
    #! usr/bin/env python
    #-*-encoding:cp1251-*-
    
    try:
        with open("input.txt") as inpt:
            with open("out.txt", "a") as out:
                account = {"mail":None,
                           "password":None}
                for line in inpt:
                    line = line.translate(None, "\r\n")
                    if not line:
                        out.write("{0}:{1}\n".format(account["mail"], account["password"]))
                        account["mail"] = None
                        account["password"] = None
                    elif not account["mail"]:
                        account["mail"] = line
                    elif not account["password"]:
                        account["password"] = line
    except Exception, e:
        print e
    
    на входе input.txt, на выходе будет out.txt
    P.S. cupper, понял что смутило в твоем коде - бесконечный цикл
     
    #10 login999, 19 Jul 2009
    Last edited: 19 Jul 2009
  11. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Эм. Я ни с кем не мерился..и не претендовал на совершенство. Лишь на работоспособность. Так что низачет.
     
  12. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Да ладно :)

    Я пошутил, хз как назвать когда человеку попросившему написать парсер предлагают 1 реализацию на PHP и две реализации на Python :D
     
  13. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Я не про тебя, тебе всегда зачет:)
     
  14. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    а причем тут хендел файла, я про списокписал
    про то что он весь файл в него сперва загоняет

    хороший цикл :), а если чтото насторазивает в нем, то такой цикл взят из учебной литературы. Мне он оч даже приглянулся

    яж написал все только в учебных целях. Если я написал что в коде можно чтото сделать лучьше, это невкоем случае незначит что его кодил плохой кодер,... проста ленивый кодер )))
     
    #14 cupper, 19 Jul 2009
    Last edited: 19 Jul 2009
  15. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Я чаще всего именно так делаю, потому что впоследствии может понадобиться делать с данными что-то еще, тогда код изменить будет легче: пароли и мыла уже считаны в удобном виде и готовы к работе. Сейчас с телефона, утром могу оптимизировать.
    И если кто не понял, я согласен, что код не самый удачный и в определенных моментах будет вести себя плохо:(
     
    #15 Fata1ex, 19 Jul 2009
    Last edited: 19 Jul 2009
  16. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Ы) Недоглядел, вопросов нет :)
    П.С. Девочки не ссорьтесь :D
     
  17. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Та мы не ссоримся, просто я обидчивая :)
     
  18. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    аааааааа! сорри ) ток сейчас вспомнил, что обещал дописать :)
    Code:
    #!/usr/bin/env python3
    
    tmp = 1
     
    with open(str(input("Enter file name: "))) as fin:
        with open("out.txt", "a") as fout:
            for line in fin:
                if line.strip():
                    fout.write(line.strip() + ':') if tmp % 2 == 1 else fout.write(line)
                    tmp += 1
    вот :) вроде оптимизировано

    сделал меньше еще на строчку :D


    ps. cupper, жду замечаний ) с обработкой исключений иди доить корову :D

    уменьшил еще на строчку оО )
     
    #18 Fata1ex, 23 Jul 2009
    Last edited: 23 Jul 2009