0

text.csv日付がそのように配置されたテキストファイルがあります。

name1
2010-01-02 (i)
2010-05-07 (i)
2010-06-12 (i)
name2
2010-01-02 (i)
2010-05-07 (i)
2010-06-12 (i)
name3
2011-01-05 (i)
2011-05-05 (i)
2011-06-14 (i)

次のように、ファイルを 2 列に再フォーマットまたは書き込みたいと思います。

+---------------+-----+
| 2010-01-02 (i)|name1|
| 2010-05-07 (i)|name1|
| 2010-06-12 (i)|name1|  
| 2010-01-02 (i)|name2|
| 2010-05-07 (i)|name2|
| 2010-06-12 (i)|name2|
| 2011-01-05 (i)|name3|
| 2011-05-05 (i)|name3|
| 2011-06-14 (i)|name3|
+---------------+-----+

ロジックは次のようになります。

if line doesn't contain "(i)", name=value
else
write date=value, name to file

PHP は使用したくありませんが、データをループすることはできます。

<?php
$file = file($path);
foreach($file as $value)
{
  if ( strpos($value, "(i)" ) !== false)
    $name = $value;

    $fp = fopen('data.csv', 'w');
    fputcsv($fp, $line);
    fclose($fp);
}

私が始めることができるPythonの例を提供できますか? Libre office calc でマクロとして実行する必要があります。

4

3 に答える 3

2

コメントで述べたように、入力ファイルは CSV ファイルではありません。以下を使用して、必要な書式を設定し、有効な CSV ファイルを生成できます。多くのスプレッドシート プログラムは、コンマまたはタブ ('\t') 文字を区切り文字として使用する CSV ファイルを読み取ることができます。

import csv
DELIMITER = ','

with open('data.csv', 'wb') as csvfile:
    writer = csv.writer(csvfile, delimiter=DELIMITER)
    row = [None, None]
    with open('input_data.txt', 'rt') as textfile:
        for line in (line.strip() for line in textfile):
            if line.endswith('(i)'):
                row[0] = line
                writer.writerow(row)
            else:
                row[1] = line
于 2014-07-05T17:10:09.343 に答える
1

別のかなり単純なアプローチ:

lines = []

with open('original.txt') as f:
    for line in f:
       if line.startswith('name'):
           key = line.rstrip()
       else:
           lines.append('{} {}'.format(line.rstrip(), key))

with open('output.txt', 'w') as f:
    f.writelines(lines)
于 2014-07-05T17:23:43.077 に答える
1
data = '''name1
2010-01-02 (i)
2010-05-07 (i)
2010-06-12 (i)
name2
2010-01-02 (i)
2010-05-07 (i)
2010-06-12 (i)
name3
2011-01-05 (i)
2011-05-05 (i)
2011-06-14 (i)'''

name = None
for line in data.splitlines():
    if '(i)' in line:
        print line, name
    else:
        name = line

結果:

2010-01-02 (i) name1
2010-05-07 (i) name1
2010-06-12 (i) name1
2010-01-02 (i) name2
2010-05-07 (i) name2
2010-06-12 (i) name2
2011-01-05 (i) name3
2011-05-05 (i) name3
2011-06-14 (i) name3

ここで、ファイルを読み取り、行を の代わりに書き込む必要がありますprint

于 2014-07-05T15:45:27.833 に答える