С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 35

Чтение из cvs файла в Android Studio

17.01.2023, 21:10. Показов 1213. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Вопрос следующий. У меня есть кнопка. По ней вызывается окно выбора файла. Далее я выбираю файл в формате .cvs. Но когда я пытаюсь его прочитать в методе readCSVFile. вызывается ошибка что файл не найден. В чём дело? Ведь файл такой существует. Может как-то не так получаю путь в файлу? В манифесте прописал разрешение на чтение и запись. Подскажите в чём дело.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
import static android.os.Build.VERSION.SDK_INT;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
 
import android.annotation.SuppressLint;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
 
 
public class ExcelActivity extends AppCompatActivity {
 
    private TextView textViewExample;
 
    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_excel);
 
        textViewExample = findViewById(R.id.textViewTest);
    }
 
    public void clickOpen(View view){
        if (SDK_INT >= Build.VERSION_CODES.R){
            if(Environment.isExternalStorageEmulated()){
                //choosing csv file
                Intent intent=new Intent();
                intent.setType("*/*");
                intent.putExtra(Intent.EXTRA_AUTO_LAUNCH_SINGLE_CHOICE,true);
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,"Select CSV File "),101);
            }
            else {
                //getting permission from user
                Intent intent=new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                startActivity(intent);
            }
        }
        else {
            // for below android 11
            Intent intent=new Intent();
            intent.setType("*/*");
            intent.putExtra(Intent.EXTRA_AUTO_LAUNCH_SINGLE_CHOICE,true);
            intent.setAction(Intent.ACTION_GET_CONTENT);
            ActivityCompat.requestPermissions(ExcelActivity.this,new String[] {WRITE_EXTERNAL_STORAGE},102);
        }
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==101 && data!=null){
            Uri fileuri =data.getData();
            textViewExample.setText(readCSVFile(fileuri));
        }
    }
 
    // this method is used for getting file path from uri
    public String getFilePathFromUri(Uri uri){
        String[] filename1;
        String fn;
        String filepath=uri.getPath();
        String filePath1[]=filepath.split(":");
        filename1 =filepath.split("/");
        fn=filename1[filename1.length-1];
        return Environment.getExternalStorageDirectory().getPath()+"/"+filePath1[1];
    }
 
    //reading file data
 
    public String readCSVFile(String path){
        String filedata = null;;
        File file=new File(path);
        try {
 
            Scanner scanner=new Scanner(file);
            while (scanner.hasNextLine()){
 
                String line=scanner.nextLine();
                String [] splited=line.split(",");
                String row="";
                for (String s:splited){
 
                    row=row+s+"  ";
 
                }
 
                filedata=filedata+row+"\n";
 
            }
 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Toast.makeText(ExcelActivity.this,"Error",Toast.LENGTH_SHORT).show();
        }
 
        return filedata;
 
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.01.2023, 21:10
Ответы с готовыми решениями:

Чтение данных из excel или cvs файла
Добрый день. Возник такой вопрос. Мне необходимо сделай возможность чтения данных из excel или cvs файла в мобильном приложении, которое...

Чтение файла cvs по строкам и запись в dbf
По первому символу(условие) в строке cvs нужно записать в dbf, т.е. если буква "Р", то записываем в dbf1, иначе в dbf2. Как это...

Чтение файлов из res в android studio
Привет! Подскажите кто знает как мне прочитать например текстовый файл из папки res/raw/textnew.txt ? Недавно перешел на Android...

4
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
18.01.2023, 04:02
Лучший ответ Сообщение было отмечено xvoe9 как решение

Решение

В манифесте ничего не надо прописывать.

Uri возвращаемый в колбэке startActivityForResult c Intent ACTION_GET_CONTENT нельзя использовать как File(Uri).
Из него не достать путь.
Пользуйтесь Logcat. И смотрите, как выглядят неизвестные вещи типа Uri или Uri.getPath().

Можно использовать getContentResolver().openInputStream(uri ). И работать с InputStream.
Или openFileDescriptor. Но ParcelFileDescriptor (и FileDescriptor) никакого отношения к File() не имеют.

И вопрос к вам, откуда такой код? Я в developer.android.com ничего близко похожего не вижу.
Давно уже нет startActivityForResult. Вместо этого используется registerForActivityResult. Он проще и удобнее.
А на котлине еще проще, короче и удобнее.
1
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 35
18.01.2023, 16:46  [ТС]
Здравствуйте. Спасибо за ответ, помогло.
Ответ на ваш вопрос - этот код нашел на ютюбе - https://www.youtube.com/watch?v=Jch3SnIGogw

Вот код страницы Activity.Только теперь другая сложность. Файл читается и выводятся ромбы какие-то. Видимо дело в кодировке. Как можно это починить?
Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import android.net.Uri
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import java.io.BufferedReader
import java.io.InputStream
 
 
class ReadActivity : AppCompatActivity() {
 
    val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
        // Handle the returned Uri
        var inputStream: InputStream? = uri?.let { applicationContext.contentResolver.openInputStream(it) }
        val reader = BufferedReader(inputStream?.reader())
        val content = StringBuilder()
        try {
            var line = reader.readLine()
            while (line != null) {
                content.append(line)
                line = reader.readLine()
            }
        } finally {
            reader.close()
        }
        val textviewResult = findViewById<TextView>(R.id.textViewResult)
        textviewResult.setText(content)
    }
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_read)
 
        val buttonRead = findViewById<Button>(R.id.buttonRead)
        val textviewResult = findViewById<TextView>(R.id.textViewResult)
 
        buttonRead.setOnClickListener{
            getContent.launch("*/*")
        }
    }
}
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
18.01.2023, 20:20
Очевидно, вы читаете файл в виндовой кодировке.
Из чего следует очевидное решение - перекодировать в UTF-8 прежде чем класть на Андроид.

Можно добавить параметр кодировки в reader. Но только в этом случае надо иметь ввиду, что все кодировки разные. Может другой файл оказать в KOI-8, например. И тогда опять в коде менять кодировку. Или делать меню выбора кодировок.

inputStream.reader(Charset.forName("WIND OWS-1251")
1
0 / 0 / 0
Регистрация: 15.07.2019
Сообщений: 35
20.01.2023, 07:56  [ТС]
Большое спасибо. Заработало. Изменил кодировку на Windows-1251.

Вот код на kotlin, на случай если кому-то потребуется сделать подобное

Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import java.io.BufferedReader
import java.io.InputStream
import java.nio.charset.Charset
 
 
class ReadActivity : AppCompatActivity() {
 
    val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
        // Handle the returned Uri
        var inputStream: InputStream? = uri?.let { applicationContext.contentResolver.openInputStream(it) }
        //inputStream?.reader(Charset.forName("UTF-8"))
        val reader = BufferedReader(inputStream?.reader(Charset.forName("Windows-1251")))
        val content = StringBuilder()
        try {
            var line = reader.readLine()
            while (line != null) {
                content.append(line)
                line = reader.readLine()
            }
        } finally {
            reader.close()
        }
        val textviewResult = findViewById<TextView>(R.id.textViewResult)
        textviewResult.setText(content)
    }
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_read)
 
        val buttonRead = findViewById<Button>(R.id.buttonRead)
        val textviewResult = findViewById<TextView>(R.id.textViewResult)
 
        buttonRead.setOnClickListener{
            getContent.launch("*/*")
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.01.2023, 07:56
Помогаю со студенческими работами здесь

Запись в файл и чтение android studio
Здравствуйте нужна помощь с файлом. Есть у меня groupbox и в нем есть checkboxы,как сделать так что бы записывались те checkbox которые...

Чтение\запись на USB FLASH через OTG кабель в Android Studio
Добрый вечер! Подскажите, какие можно использовать библиотеки для чтения/записи файлов с/на USB FLASH в android приложении. Необходимо...

Проблемы с первым запуском Android Studio (AMD, Win10x64, Android Studio 4.1.1), прошу совета
Вводные: AMD, Win10x64, Android Studio 4.1.1. java version &quot;15.0.1&quot; 2020-10-20 Java(TM) SE Runtime Environment (build 15.0.1+9-18) ...

(Android studio, java) Ошибка при импорте библиотеки cannot resolve symbol android studio
Вот библиотека https://github.com/mik3y/usb-serial-for-android. Устанавливал так, File -&gt; New -&gt; Import module. Студия ругается на...

Android Studio установка apk файла на телефон
Скачиваю для теста файл app-debug.apk с папки app\build\outputs\apk на другое свое андроид устройство, затем устанавливаю, пишет идет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru