Как добавить имя файла в последней строке каждого файла?

в .xml:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textIsSelectable="true" />

в .class:

textview.setCustomSelectionActionModeCallback(new callback(textview));
...
public class callback implements Callback {

    private TextView mTextView;

    public callback(TextView text) {
        this.mTextView = text;

    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        int start = mTextView.getSelectionStart();
        int end = mTextView.getSelectionEnd();
        Spannable wordtoSpan = (Spannable) mTextView.getText();

        switch (item.getItemId()) {

        case R.id.item_blue:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.BLUE), start
                    , end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.BLUE);
            return true;

        case R.id.item_green:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.GREEN), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.GREEN);
            return true;

        case R.id.item_red:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.RED), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.RED);
            return true;
        case R.id.item_yellow:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.YELLOW), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.YELLOW);
            return true;
        case R.id.item_erase:
            wordtoSpan.setSpan(new BackgroundColorSpan(Color.TRANSPARENT), start, end,
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            singlenton.getInstance().getDatabase().createMarkText(mTextView,Color.TRANSPARENT);
            return true;
        }
        return false;
    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        mode.setTitle("Selecione a cor");
        mode.getMenuInflater().inflate(R.menu.menu_text_context, menu);

        return true;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        menu.removeItem(android.R.id.selectAll);
        // Remove the "cut" option
        menu.removeItem(android.R.id.cut);
        // Remove the "copy all" option
        menu.removeItem(android.R.id.copy);
        return true;
    }

}
-1
задан martineau 7 March 2019 в 22:47
поделиться

2 ответа

Итак, я предполагаю, что вы берете список файлов, и те столбцы, о которых вы упоминали [0,1,2], ссылаются на последние строки каждого файла в вашем списке. Имея это в виду, я бы попробовал более простой подход вместо фрейма данных. И даже если вам нужно использовать фрейм данных по другим причинам, возможно, вы можете преобразовать его в текст в качестве последнего шага и попробовать это:

Example File ("ExampleText2"):
I love coffee
I love creamer
I love coffee and creamer
I have a rash..

Код:

last = []
with open('exampleText2.txt', 'r') as f:
    last = f.readlines()[-1] + " other FileName"

Вывод: [ 114]

последнее «у меня сыпь .. другое имя файла»

readlines () вернет список из всех строк в вашем файле, так что вы можете попробовать вызвать -1, чтобы вытянуть последнюю строку, а затем добавить к ней.

0
ответ дан RockAndRoleCoder 7 March 2019 в 22:47
поделиться

Вопрос плохо определен, но если предположить, что OP хочет получить результат, показанный в примере DataFrame (то есть не только последняя строка каким-то образом украшена именем файла, но все строки), здесь есть способ добиться этого. Для этого примера у нас есть только два файла: file1.txt содержит две строки: «a» и «b», file2.txt содержит одну строку: «c».

Мы пишем средство чтения файлов, которое возвращает список списков: каждый подсписок содержит имя файла и строку.

import glob

def get_file(filename):
    with open(filename) as f:
        return [[filename, line.rstrip('\n')] for line in f]

Попробуйте:

m = map(get_file, glob.glob('file*.txt'))
list(m)

Out[]:
[[['file2.txt', 'c']], [['file1.txt', 'a'], ['file1.txt', 'b']]]

Давайте сгладим эти списки, чтобы получить один двумерный массив. Кроме того, вероятно, лучше получить результат, когда файлы отсортированы в алфавитном порядке.

def flatten(m):
    return [k for sublist in m for k in sublist]

m = map(get_file, sorted(glob.glob('file*.txt')))
flatten(m)

Out[]:
[['file1.txt', 'a'], ['file1.txt', 'b'], ['file2.txt', 'c']]

Теперь иногда полезно иметь номер строки (например, если мы собираемся поместить эти данные в DataFrame и выполнить дальнейшую сортировку и аналитику). Наш читатель становится:

def get_file(filename):
    with open(filename) as f:
        return [[filename, lineno, line.rstrip('\n')] for lineno, line in enumerate(f, start=1)]

m = map(get_file, sorted(glob.glob('file*.txt')))
out = pd.DataFrame(flatten(m), columns=['filename', 'lineno', 'line'])
out

Out[]:
    filename  lineno line
0  file1.txt       1    a
1  file1.txt       2    b
2  file2.txt       1    c

Обратите внимание, что вышеприведенный map прекрасно подходит для многопоточного чтения, если у нас есть большое количество файлов:

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=4) as pool:
    m = pool.map(get_file, sorted(glob.glob('file*.txt')))
    out = pd.DataFrame(flatten(m), columns=['filename', 'lineno', 'line'])
out

Out[]:
    filename  lineno line
0  file1.txt       1    a
1  file1.txt       2    b
2  file2.txt       1    c
0
ответ дан Pierre D 7 March 2019 в 22:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: