21

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

ADR написав:

Delphi (не провіряв вивід, але воно компілюється:)

Прихований текст
program ParseBuildings;
uses
  Classes;

var
  StrList: TStringList;
  I: Integer;
begin
  StrList := TStringList.Create;
  with StrList do
    try
      LoadFromFile('buildings.txt');
      NameValueSeparator := '    ';
      for I := 0 to Count -1 do
        if Pos('    ', ValueFromIndex[i]) = 0 then
          WriteLn(Names[i] + ' | ' + ValueFromIndex[i])
    finally
        StrList.Free;
    end;
end.

Компілюється - можливо. Але можете бодай комент підкинути? Бо щось я не вкурив тут...

22

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

C#:

using System;
using System.IO; 

public class HelloWorld
{
    static public void Main ()
    {
        try
        {
            using (StreamReader reader = new StreamReader("t.html"))
            {
                String line;
                while ((line = reader.ReadLine()) != null)
                {
                    String[] items = line.Trim().Split(new Char[] {'\t'});
                    if (items.Length == 2)
                    {
                        Console.WriteLine("Street: " + items[0]);
                        Console.WriteLine("House: " + items[1]);
                        Console.WriteLine();
                    }
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
 
}

Output:

Street: вул. Сергія Єфремова
House: 1/2

Street: вул. 100-Р.Червоного Хреста
House: 1

Street: вул. 100-Р.Червоного Хреста
House: 2

Street: вул. 100-Р.Червоного Хреста
House: 3

Street: вул. 100-Р.Червоного Хреста
House: 2в

Street: вул. 2000-Ліття Різдва Христового
House: 4

Street: вул. 24 Серпня
House: 1
Подякували: leofun011

23

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

Ruby:

counter = 1
file = File.new("t.html", "r")
while (line = file.gets)
    lines = line.strip.split("\t")
    if (lines.size == 2)
        puts "Street: #{line[0]}\nHouse: #{line[1]}\n\n"
    end
end
file.close

Output:

Street: вул. Сергія Єфремова
House: 1/2

Street: вул. 100-Р.Червоного Хреста
House: 1

Street: вул. 100-Р.Червоного Хреста
House: 2

Street: вул. 100-Р.Червоного Хреста
House: 3

Street: вул. 100-Р.Червоного Хреста
House: 2в

Street: вул. 2000-Ліття Різдва Христового
House: 4

Street: вул. 24 Серпня
House: 1
Подякували: leofun011

24

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

Трохи спростив :)
Ruby:

IO.foreach "t.html" do |line|
    lines = line.strip.split("\t")
    puts (lines.size == 2) ? "Street: #{line[0]}\nHouse: #{line[1]}\n\n" : ""
end

P.S. Шкода, що end потрібно в кінці конструкцій використовувати.

Подякували: ADR, leofun01, ostap34PHP4

25

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

Bartash написав:
ADR написав:

Delphi (не провіряв вивід, але воно компілюється:)

Прихований текст
program ParseBuildings;
uses
  Classes;

var
  StrList: TStringList;
  I: Integer;
begin
  StrList := TStringList.Create;
  with StrList do
    try
      LoadFromFile('buildings.txt');
      NameValueSeparator := '    ';
      for I := 0 to Count -1 do
        if Pos('    ', ValueFromIndex[i]) = 0 then
          WriteLn(Names[i] + ' | ' + ValueFromIndex[i])
    finally
        StrList.Free;
    end;
end.

Компілюється - можливо. Але можете бодай комент підкинути? Бо щось я не вкурив тут...

Так краще?

26

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

ADR написав:
Bartash написав:
ADR написав:

Delphi (не провіряв вивід, але воно компілюється:)

Прихований текст
program ParseBuildings;
uses
  Classes;

var
  StrList: TStringList;
  I: Integer;
begin
  StrList := TStringList.Create;
  with StrList do
    try
      LoadFromFile('buildings.txt');
      NameValueSeparator := '    ';
      for I := 0 to Count -1 do
        if Pos('    ', ValueFromIndex[i]) = 0 then
          WriteLn(Names[i] + ' | ' + ValueFromIndex[i])
    finally
        StrList.Free;
    end;
end.

Компілюється - можливо. Але можете бодай комент підкинути? Бо щось я не вкурив тут...

Так краще?

Значно ліпше, дякую. Тепер усе стало на місця в голові. :)

27 Востаннє редагувалося User 298 (19.03.2013 07:06:28)

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

Replace написав:

Трохи спростив :)
Ruby:

IO.foreach "t.html" do |line|
    lines = line.strip.split("\t")
    puts (lines.size == 2) ? "Street: #{line[0]}\nHouse: #{line[1]}\n\n" : ""
end

P.S. Шкода, що end потрібно в кінці конструкцій використовувати.

Скидається на те, що лавровий вінець дістанеться Рубінові у цій задачі:).

28

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

оновив тему і додав голосування. Реально рубі тут дивиться елегантно  =)

29

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

На Python при бажанні теж можна код скоротити і вийде по кількості рядків як і в Ruby.

30

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

Python:

lines = [line.strip().split('\t') for line in open('t.html')]
for line in lines:
    print len(line) == 2 and 'Street: ' + line[0] + '\nHouse: ' + line[1] + '\n' or ''

Виведення:

Street: вул. Сергія Єфремова
House: 1/2

Street: вул. 100-Р.Червоного Хреста
House: 1

Street: вул. 100-Р.Червоного Хреста
House: 2

Street: вул. 100-Р.Червоного Хреста
House: 3

Street: вул. 100-Р.Червоного Хреста
House: 2в

Street: вул. 2000-Ліття Різдва Христового
House: 4

Street: вул. 24 Серпня
House: 1

Хоча по кількості символів та кількості конструкцій Ruby всеодно краще. =)

Подякували: leofun012

31

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

funivan написав:

оновив тему і додав голосування. Реально рубі тут дивиться елегантно  =)

Може, у першому пості теми варто поспойлити розв'язки? Бо повідомлення виходить досить громіздким. :)

32

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

На Python при бажанні теж можна код скоротити і вийде по кількості рядків як і в Ruby.

Ну я не бачу смислу скорочувати код. На мою думку не в кількості рядків суть а в прозорості.
Наприклад ці два куски коду зовсім по різному читаються. Тобто менше конструкцій менше ф-цій викликається а в один рядок багато чого можна написати =))) А смисл?

lines = [line.strip().split('\t') for line in open('t.html')]
IO.foreach "t.html" do |line|
   lines = line.strip.split("\t")

Погоджуєтесь ?

Подякували: Replace, Torbins, leofun013

33

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

Якщо уже ганятися за рядками, то більшість мов дозволяє взагалі усе в один рядок написати. Головне розділові знаки не забути.
А взагалі не дивно, що скриптові мови у задачі по обробці тексту виявилися кращими.

34

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

А взагалі не дивно, що скриптові мови у задачі по обробці тексту виявилися кращими.

таки так. Це цілком логічно =) Але побачити реалізацію на інших мовах теж цікаво ;)

35 Востаннє редагувалося Vo_Vik (19.03.2013 16:18:22)

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

Мене, наприклад, в подібних темах цікавить не краще-гірше. А просто побачити реалізації на різних мовах.

36 Востаннє редагувалося 221VOLT (24.10.2019 01:59:11)

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

Erlang (Erlang/OTP 22 [erts-10.4])

-module(rs).
-compile([export_all, nowarn_export_all]).

%do(FileName) ->
%  {ok, File} = file:open(FileName, [read]),
do() ->
  {ok, File} = file:open("file.txt", [read]),
  do2(File).

do2(File) ->
  case io:get_line(File, "") of
    eof ->
      file:close(File), io:format("all ok!~n",[]);
    Line ->
      Z = string:split(Line, "    \n", all), % second argument also can be [9] , because code of tab-symbol = 9 , so "    " =:= [9] equals true, "\n" =:= [10]
      do3(Z, 0),
      do2(File)
  end.

do3([],_) -> ok;
do3([[]|T], N) -> do3(T, N);
do3([H|T], 0) -> w2f(["Street: ", H, "\n"]), do3(T, 1);
do3([H|_T], 1) -> w2f(["House: ", H, "\n\n"]), ok.

w2f(V) -> file:write_file("data2.txt", io_lib:fwrite("~s", [unicode:characters_to_binary(V, utf8, latin1)]), [append]).

compile && run

c(rs).
rs:do().

out:

Street: вул. Сергія Єфремова
House: 1/2


Street: вул. 100-Р.Червоного Хреста
House: 1


Street: вул. 100-Р.Червоного Хреста
House: 2


Street: вул. 100-Р.Червоного Хреста
House: 3

Street: вул. 100-Р.Червоного Хреста
House: 2в


Street: вул. 2000-Ліття Різдва Христового
House: 4


Street: вул. 24 Серпня
House: 1

upd. ля! форум таб захавав, замінює на пробіли ))
у такому випадку строчку

Z = string:split(Line, "    \n", all),

можна замінити на

Z = string:split(Line, [9,10], all),

бо в ерлангу спискові строки -- це просто список кодів символів, ха)

Все на світі, як вода, Світла радість і біда.
Все тече і все біжить в нікуди,
Все на світі, як пісок, Залиши на ньому крок,
Змиє все вода, було й так буде.
Подякували: ostap34PHP1

37

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

Rust:

use std::fs::File;
use std::io::{BufReader, BufRead};

fn main() {
  if let Ok(file) = File::open("buildings.txt") {
    for line in BufReader::new(file).lines() {
      if let Ok(pair) = line {
        let parts : Vec<_> = pair.split('\t')
                                 .collect();
        if let [street, house] = parts.as_slice() {
          println!("Street: {}\nHouse: {}\n", street, house);
        }
      }
    }
  }
}

Результат:

Прихований текст
Street: вул. Сергія Єфремова
House: 1/2

Street: вул. 100-Р.Червоного Хреста
House: 1

Street: вул. 100-Р.Червоного Хреста
House: 2

Street: вул. 100-Р.Червоного Хреста
House: 3

Street: вул. 100-Р.Червоного Хреста
House: 2в

Street: вул. 2000-Ліття Різдва Христового
House: 4

Street: вул. 24 Серпня
House: 1
Подякували: 221VOLT1

38

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

Ще один Rust, за допомогою оператора try (але довелося додати boilerplate для обробки помилок):

use std::fs::File;
use std::io::{BufReader, BufRead};
use std::io::Error;
use std::boxed::Box;

fn main() -> Result<(), Box<Error>> {
  let file = File::open("buildings.txt")?;

  for line in BufReader::new(file).lines() {
    let pair = line?;
    let parts : Vec<_> = pair.split('\t')
                             .collect();
    if let [street, house] = parts.as_slice() {
      println!("Street: {}\nHouse: {}\n", street, house);
    }
  }
  
  Ok(())
}
Подякували: 221VOLT1

39

Re: Обробка файлу PHP & Python & Ruby & С++ & Java та багато інших

PHP написав:
<?php # author @dot
$source = fopen(__DIR__ . '/db.txt', 'r');

while (($line = fgetcsv($source, false, "\t")) !== false) {
    echo count($line) == 2 ? "Street: {$line[0]}\nHouse : {$line[1]}\n\n" : '';
}

fclose($source);
Прихований текст

Street: вул. Сергія Єфремова
House : 1/2

Street: вул. 100-Р.Червоного Хреста
House : 1

Street: вул. 100-Р.Червоного Хреста
House : 2

Street: вул. 100-Р.Червоного Хреста
House : 3

Street: вул. 100-Р.Червоного Хреста
House : 2в

Street: вул. 2000-Ліття Різдва Христового
House : 4

Street: вул. 24 Серпня
House : 1

Подякували: leofun01, koala, 221VOLT, ostap34PHP4